ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXVzYiBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXVzYgppbmRleCBkZWI2YjQ4Li5hMDdjMGYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy11c2IKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtdXNiCkBAIC0yMSwyNSArMjEsMjcgQEAKIERlc2NyaXB0aW9uOgogCQlFYWNoIFVTQiBkZXZpY2UgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpbGUgbmFtZWQKIAkJcG93ZXIvbGV2ZWwuICBUaGlzIGZpbGUgaG9sZHMgYSBwb3dlci1sZXZlbCBzZXR0aW5nIGZvcgotCQl0aGUgZGV2aWNlLCBvbmUgb2YgIm9uIiwgImF1dG8iLCBvciAic3VzcGVuZCIuCisJCXRoZSBkZXZpY2UsIGVpdGhlciAib24iIG9yICJhdXRvIi4KIAogCQkib24iIG1lYW5zIHRoYXQgdGhlIGRldmljZSBpcyBub3QgYWxsb3dlZCB0byBhdXRvc3VzcGVuZCwKIAkJYWx0aG91Z2ggbm9ybWFsIHN1c3BlbmRzIGZvciBzeXN0ZW0gc2xlZXAgd2lsbCBzdGlsbAogCQliZSBob25vcmVkLiAgImF1dG8iIG1lYW5zIHRoZSBkZXZpY2Ugd2lsbCBhdXRvc3VzcGVuZAogCQlhbmQgYXV0b3Jlc3VtZSBpbiB0aGUgdXN1YWwgbWFubmVyLCBhY2NvcmRpbmcgdG8gdGhlCi0JCWNhcGFiaWxpdGllcyBvZiBpdHMgZHJpdmVyLiAgInN1c3BlbmQiIG1lYW5zIHRoZSBkZXZpY2UKLQkJaXMgZm9yY2VkIGludG8gYSBzdXNwZW5kZWQgc3RhdGUgYW5kIGl0IHdpbGwgbm90IGF1dG9yZXN1bWUKLQkJaW4gcmVzcG9uc2UgdG8gSS9PIHJlcXVlc3RzLiAgSG93ZXZlciByZW1vdGUtd2FrZXVwIHJlcXVlc3RzCi0JCWZyb20gdGhlIGRldmljZSBtYXkgc3RpbGwgYmUgZW5hYmxlZCAodGhlIHJlbW90ZS13YWtldXAKLQkJc2V0dGluZyBpcyBjb250cm9sbGVkIHNlcGFyYXRlbHkgYnkgdGhlIHBvd2VyL3dha2V1cAotCQlhdHRyaWJ1dGUpLgorCQljYXBhYmlsaXRpZXMgb2YgaXRzIGRyaXZlci4KIAogCQlEdXJpbmcgbm9ybWFsIHVzZSwgZGV2aWNlcyBzaG91bGQgYmUgbGVmdCBpbiB0aGUgImF1dG8iCi0JCWxldmVsLiAgVGhlIG90aGVyIGxldmVscyBhcmUgbWVhbnQgZm9yIGFkbWluaXN0cmF0aXZlIHVzZXMuCisJCWxldmVsLiAgVGhlICJvbiIgbGV2ZWwgaXMgbWVhbnQgZm9yIGFkbWluaXN0cmF0aXZlIHVzZXMuCiAJCUlmIHlvdSB3YW50IHRvIHN1c3BlbmQgYSBkZXZpY2UgaW1tZWRpYXRlbHkgYnV0IGxlYXZlIGl0CiAJCWZyZWUgdG8gd2FrZSB1cCBpbiByZXNwb25zZSB0byBJL08gcmVxdWVzdHMsIHlvdSBzaG91bGQKIAkJd3JpdGUgIjAiIHRvIHBvd2VyL2F1dG9zdXNwZW5kLgogCisJCURldmljZSBub3QgY2FwYWJsZSBvZiBwcm9wZXIgc3VzcGVuZCBhbmQgcmVzdW1lIHNob3VsZCBiZQorCQlsZWZ0IGluIHRoZSAib24iIGxldmVsLiAgQWx0aG91Z2ggdGhlIFVTQiBzcGVjIHJlcXVpcmVzCisJCWRldmljZXMgdG8gc3VwcG9ydCBzdXNwZW5kL3Jlc3VtZSwgbWFueSBvZiB0aGVtIGRvIG5vdC4KKwkJSW4gZmFjdCBzbyBtYW55IGRvbid0IHRoYXQgYnkgZGVmYXVsdCwgdGhlIFVTQiBjb3JlCisJCWluaXRpYWxpemVzIGFsbCBub24taHViIGRldmljZXMgaW4gdGhlICJvbiIgbGV2ZWwuICBTb21lCisJCWRyaXZlcnMgbWF5IGNoYW5nZSB0aGlzIHNldHRpbmcgd2hlbiB0aGV5IGFyZSBib3VuZC4KKwogV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLy4uLi9wb3dlci9wZXJzaXN0CiBEYXRlOgkJTWF5IDIwMDcKIEtlcm5lbFZlcnNpb246CTIuNi4yMwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZHJpdmVyLnR4dCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RyaXZlci50eHQKaW5kZXggNjAxMjBmYi4uZDJjZDZmYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZHJpdmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kcml2ZXIudHh0CkBAIC0yMjYsNSArMjI2LDUgQEAKIFRoaXMgY2FuIHRoZW4gYmUgdXNlZCB0byBhZGQgYW5kIHJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20gdGhlCiBkcml2ZXIncyBkaXJlY3RvcnkgdXNpbmc6CiAKLWludCBkcml2ZXJfY3JlYXRlX2ZpbGUoc3RydWN0IGRldmljZV9kcml2ZXIgKiwgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKik7Ci12b2lkIGRyaXZlcl9yZW1vdmVfZmlsZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqLCBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqKTsKK2ludCBkcml2ZXJfY3JlYXRlX2ZpbGUoc3RydWN0IGRldmljZV9kcml2ZXIgKiwgY29uc3Qgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKik7Cit2b2lkIGRyaXZlcl9yZW1vdmVfZmlsZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqLCBjb25zdCBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy50eHQKaW5kZXggYjI0NWQ1Mi4uOTMxYzgwNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy50eHQKQEAgLTkxLDggKzkxLDggQEAKIAkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiB9OwogCi1pbnQgZGV2aWNlX2NyZWF0ZV9maWxlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKik7Ci12b2lkIGRldmljZV9yZW1vdmVfZmlsZShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICopOworaW50IGRldmljZV9jcmVhdGVfZmlsZShzdHJ1Y3QgZGV2aWNlICosIGNvbnN0IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICopOwordm9pZCBkZXZpY2VfcmVtb3ZlX2ZpbGUoc3RydWN0IGRldmljZSAqLCBjb25zdCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqKTsKIAogSXQgYWxzbyBkZWZpbmVzIHRoaXMgaGVscGVyIGZvciBkZWZpbmluZyBkZXZpY2UgYXR0cmlidXRlczogCiAKQEAgLTMxNiw4ICszMTYsOCBAQAogCiBDcmVhdGlvbi9SZW1vdmFsOgogCi1pbnQgZGV2aWNlX2NyZWF0ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiBhdHRyKTsKLXZvaWQgZGV2aWNlX3JlbW92ZV9maWxlKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICogYXR0cik7CitpbnQgZGV2aWNlX2NyZWF0ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiBhdHRyKTsKK3ZvaWQgZGV2aWNlX3JlbW92ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiBhdHRyKTsKIAogCiAtIGJ1cyBkcml2ZXJzIChpbmNsdWRlL2xpbnV4L2RldmljZS5oKQpAQCAtMzU4LDcgKzM1OCw3IEBACiAKIENyZWF0aW9uL1JlbW92YWw6CiAKLWludCBkcml2ZXJfY3JlYXRlX2ZpbGUoc3RydWN0IGRldmljZV9kcml2ZXIgKiwgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKik7Ci12b2lkIGRyaXZlcl9yZW1vdmVfZmlsZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqLCBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqKTsKK2ludCBkcml2ZXJfY3JlYXRlX2ZpbGUoc3RydWN0IGRldmljZV9kcml2ZXIgKiwgY29uc3Qgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKik7Cit2b2lkIGRyaXZlcl9yZW1vdmVfZmlsZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqLCBjb25zdCBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqKTsKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Nb2RlbHMudHh0CmluZGV4IGU5M2FmZmYuLmU3MmNlZTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Nb2RlbHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Nb2RlbHMudHh0CkBAIC00MDMsNCArNDAzLDUgQEAKIENpcnJ1cyBMb2dpYyBDUzQyMDYvNDIwNwogPT09PT09PT09PT09PT09PT09PT09PT09CiAgIG1icDU1CQlNYWNCb29rIFBybyA1LDUKKyAgaW1hYzI3CUlNYWMgMjcgSW5jaAogICBhdXRvCQlCSU9TIHNldHVwIChkZWZhdWx0KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dCBiL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQKaW5kZXggYTQ1MjIyNy4uNWVmZmE1YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CkBAIC0yNiwxMyArMjYsMzMgQEAKIAogIC0gU2VuZCB0aGUgcGF0Y2gsIGFmdGVyIHZlcmlmeWluZyB0aGF0IGl0IGZvbGxvd3MgdGhlIGFib3ZlIHJ1bGVzLCB0bwogICAgc3RhYmxlQGtlcm5lbC5vcmcuCisgLSBUbyBoYXZlIHRoZSBwYXRjaCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIHRoZSBzdGFibGUgdHJlZSwgYWRkIHRoZQorICAgdGhlIHRhZworICAgICBDYzogc3RhYmxlQGtlcm5lbC5vcmcKKyAgIGluIHRoZSBzaWduLW9mZiBhcmVhLiBPbmNlIHRoZSBwYXRjaCBpcyBtZXJnZWQgaXQgd2lsbCBiZSBhcHBsaWVkIHRvCisgICB0aGUgc3RhYmxlIHRyZWUgd2l0aG91dCBhbnl0aGluZyBlbHNlIG5lZWRpbmcgdG8gYmUgZG9uZSBieSB0aGUgYXV0aG9yCisgICBvciBzdWJzeXN0ZW0gbWFpbnRhaW5lci4KKyAtIElmIHRoZSBwYXRjaCByZXF1aXJlcyBvdGhlciBwYXRjaGVzIGFzIHByZXJlcXVpc2l0ZXMgd2hpY2ggY2FuIGJlCisgICBjaGVycnktcGlja2VkIHRoYW4gdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0IGluCisgICB0aGUgc2lnbi1vZmYgYXJlYToKKworICAgICBDYzogPHN0YWJsZUBrZXJuZWwub3JnPiAjIC4zMi54OiBhMWY4NGEzOiBzY2hlZDogQ2hlY2sgZm9yIGlkbGUKKyAgICAgQ2M6IDxzdGFibGVAa2VybmVsLm9yZz4gIyAuMzIueDogMWI5NTA4Zjogc2NoZWQ6IFJhdGUtbGltaXQgbmV3aWRsZQorICAgICBDYzogPHN0YWJsZUBrZXJuZWwub3JnPiAjIC4zMi54OiBmZDIxMDczOiBzY2hlZDogRml4IGFmZmluaXR5IGxvZ2ljCisgICAgIENjOiA8c3RhYmxlQGtlcm5lbC5vcmc+ICMgLjMyLngKKyAgICBTaWduZWQtb2ZmLWJ5OiBJbmdvIE1vbG5hciA8bWluZ29AZWx0ZS5odT4KKworICAgVGhlIHRhZyBzZXF1ZW5jZSBoYXMgdGhlIG1lYW5pbmcgb2Y6CisgICAgIGdpdCBjaGVycnktcGljayBhMWY4NGEzCisgICAgIGdpdCBjaGVycnktcGljayAxYjk1MDhmCisgICAgIGdpdCBjaGVycnktcGljayBmZDIxMDczCisgICAgIGdpdCBjaGVycnktcGljayA8dGhpcyBjb21taXQ+CisKICAtIFRoZSBzZW5kZXIgd2lsbCByZWNlaXZlIGFuIEFDSyB3aGVuIHRoZSBwYXRjaCBoYXMgYmVlbiBhY2NlcHRlZCBpbnRvIHRoZQogICAgcXVldWUsIG9yIGEgTkFLIGlmIHRoZSBwYXRjaCBpcyByZWplY3RlZC4gIFRoaXMgcmVzcG9uc2UgbWlnaHQgdGFrZSBhIGZldwogICAgZGF5cywgYWNjb3JkaW5nIHRvIHRoZSBkZXZlbG9wZXIncyBzY2hlZHVsZXMuCiAgLSBJZiBhY2NlcHRlZCwgdGhlIHBhdGNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIC1zdGFibGUgcXVldWUsIGZvciByZXZpZXcgYnkKICAgIG90aGVyIGRldmVsb3BlcnMgYW5kIGJ5IHRoZSByZWxldmFudCBzdWJzeXN0ZW0gbWFpbnRhaW5lci4KLSAtIElmIHRoZSBzdGFibGVAa2VybmVsLm9yZyBhZGRyZXNzIGlzIGFkZGVkIHRvIGEgcGF0Y2gsIHdoZW4gaXQgZ29lcyBpbnRvCi0gICBMaW51cydzIHRyZWUgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGVtYWlsZWQgdG8gdGhlIHN0YWJsZSB0ZWFtLgogIC0gU2VjdXJpdHkgcGF0Y2hlcyBzaG91bGQgbm90IGJlIHNlbnQgdG8gdGhpcyBhbGlhcywgYnV0IGluc3RlYWQgdG8gdGhlCiAgICBkb2N1bWVudGVkIHNlY3VyaXR5QGtlcm5lbC5vcmcgYWRkcmVzcy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9wb3dlci1tYW5hZ2VtZW50LnR4dAppbmRleCBjN2MxZGMyLi4zYmY2ODE4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9wb3dlci1tYW5hZ2VtZW50LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9wb3dlci1tYW5hZ2VtZW50LnR4dApAQCAtNzEsMTIgKzcxLDEwIEBACiAJRm9ybXMgb2YgZHluYW1pYyBQTQogCS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotRHluYW1pYyBzdXNwZW5kcyBjYW4gb2NjdXIgaW4gdHdvIHdheXM6IG1hbnVhbCBhbmQgYXV0b21hdGljLgotIk1hbnVhbCIgbWVhbnMgdGhhdCB0aGUgdXNlciBoYXMgdG9sZCB0aGUga2VybmVsIHRvIHN1c3BlbmQgYSBkZXZpY2UsCi13aGVyZWFzICJhdXRvbWF0aWMiIG1lYW5zIHRoYXQgdGhlIGtlcm5lbCBoYXMgZGVjaWRlZCBhbGwgYnkgaXRzZWxmIHRvCi1zdXNwZW5kIGEgZGV2aWNlLiAgQXV0b21hdGljIHN1c3BlbmQgaXMgY2FsbGVkICJhdXRvc3VzcGVuZCIgZm9yCi1zaG9ydC4gIEluIGdlbmVyYWwsIGEgZGV2aWNlIHdvbid0IGJlIGF1dG9zdXNwZW5kZWQgdW5sZXNzIGl0IGhhcyBiZWVuCi1pZGxlIGZvciBzb21lIG1pbmltdW0gcGVyaW9kIG9mIHRpbWUsIHRoZSBzby1jYWxsZWQgaWRsZS1kZWxheSB0aW1lLgorRHluYW1pYyBzdXNwZW5kcyBvY2N1ciB3aGVuIHRoZSBrZXJuZWwgZGVjaWRlcyB0byBzdXNwZW5kIGFuIGlkbGUKK2RldmljZS4gIFRoaXMgaXMgY2FsbGVkICJhdXRvc3VzcGVuZCIgZm9yIHNob3J0LiAgSW4gZ2VuZXJhbCwgYSBkZXZpY2UKK3dvbid0IGJlIGF1dG9zdXNwZW5kZWQgdW5sZXNzIGl0IGhhcyBiZWVuIGlkbGUgZm9yIHNvbWUgbWluaW11bSBwZXJpb2QKK29mIHRpbWUsIHRoZSBzby1jYWxsZWQgaWRsZS1kZWxheSB0aW1lLgogCiBPZiBjb3Vyc2UsIG5vdGhpbmcgdGhlIGtlcm5lbCBkb2VzIG9uIGl0cyBvd24gaW5pdGlhdGl2ZSBzaG91bGQKIHByZXZlbnQgdGhlIGNvbXB1dGVyIG9yIGl0cyBkZXZpY2VzIGZyb20gd29ya2luZyBwcm9wZXJseS4gIElmIGEKQEAgLTk2LDEwICs5NCwxMSBAQAogV2UgY2FuIGNhdGVnb3JpemUgcG93ZXIgbWFuYWdlbWVudCBldmVudHMgaW4gdHdvIGJyb2FkIGNsYXNzZXM6CiBleHRlcm5hbCBhbmQgaW50ZXJuYWwuICBFeHRlcm5hbCBldmVudHMgYXJlIHRob3NlIHRyaWdnZXJlZCBieSBzb21lCiBhZ2VudCBvdXRzaWRlIHRoZSBVU0Igc3RhY2s6IHN5c3RlbSBzdXNwZW5kL3Jlc3VtZSAodHJpZ2dlcmVkIGJ5Ci11c2Vyc3BhY2UpLCBtYW51YWwgZHluYW1pYyBzdXNwZW5kL3Jlc3VtZSAoYWxzbyB0cmlnZ2VyZWQgYnkKLXVzZXJzcGFjZSksIGFuZCByZW1vdGUgd2FrZXVwICh0cmlnZ2VyZWQgYnkgdGhlIGRldmljZSkuICBJbnRlcm5hbAotZXZlbnRzIGFyZSB0aG9zZSB0cmlnZ2VyZWQgd2l0aGluIHRoZSBVU0Igc3RhY2s6IGF1dG9zdXNwZW5kIGFuZAotYXV0b3Jlc3VtZS4KK3VzZXJzcGFjZSksIG1hbnVhbCBkeW5hbWljIHJlc3VtZSAoYWxzbyB0cmlnZ2VyZWQgYnkgdXNlcnNwYWNlKSwgYW5kCityZW1vdGUgd2FrZXVwICh0cmlnZ2VyZWQgYnkgdGhlIGRldmljZSkuICBJbnRlcm5hbCBldmVudHMgYXJlIHRob3NlCit0cmlnZ2VyZWQgd2l0aGluIHRoZSBVU0Igc3RhY2s6IGF1dG9zdXNwZW5kIGFuZCBhdXRvcmVzdW1lLiAgTm90ZSB0aGF0CithbGwgZHluYW1pYyBzdXNwZW5kIGV2ZW50cyBhcmUgaW50ZXJuYWw7IGV4dGVybmFsIGFnZW50cyBhcmUgbm90CithbGxvd2VkIHRvIGlzc3VlIGR5bmFtaWMgc3VzcGVuZHMuCiAKIAogCVRoZSB1c2VyIGludGVyZmFjZSBmb3IgZHluYW1pYyBQTQpAQCAtMTQ1LDkgKzE0NCw5IEBACiAJCW51bWJlciBvZiBzZWNvbmRzIHRoZSBkZXZpY2Ugc2hvdWxkIHJlbWFpbiBpZGxlIGJlZm9yZQogCQl0aGUga2VybmVsIHdpbGwgYXV0b3N1c3BlbmQgaXQgKHRoZSBpZGxlLWRlbGF5IHRpbWUpLgogCQlUaGUgZGVmYXVsdCBpcyAyLiAgMCBtZWFucyB0byBhdXRvc3VzcGVuZCBhcyBzb29uIGFzCi0JCXRoZSBkZXZpY2UgYmVjb21lcyBpZGxlLCBhbmQgLTEgbWVhbnMgbmV2ZXIgdG8KLQkJYXV0b3N1c3BlbmQuICBZb3UgY2FuIHdyaXRlIGEgbnVtYmVyIHRvIHRoZSBmaWxlIHRvCi0JCWNoYW5nZSB0aGUgYXV0b3N1c3BlbmQgaWRsZS1kZWxheSB0aW1lLgorCQl0aGUgZGV2aWNlIGJlY29tZXMgaWRsZSwgYW5kIG5lZ2F0aXZlIHZhbHVlcyBtZWFuCisJCW5ldmVyIHRvIGF1dG9zdXNwZW5kLiAgWW91IGNhbiB3cml0ZSBhIG51bWJlciB0byB0aGUKKwkJZmlsZSB0byBjaGFuZ2UgdGhlIGF1dG9zdXNwZW5kIGlkbGUtZGVsYXkgdGltZS4KIAogV3JpdGluZyAiLTEiIHRvIHBvd2VyL2F1dG9zdXNwZW5kIGFuZCB3cml0aW5nICJvbiIgdG8gcG93ZXIvbGV2ZWwgZG8KIGVzc2VudGlhbGx5IHRoZSBzYW1lIHRoaW5nIC0tIHRoZXkgYm90aCBwcmV2ZW50IHRoZSBkZXZpY2UgZnJvbSBiZWluZwpAQCAtMzc3LDkgKzM3Niw5IEBACiByb3V0aW5lIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIHRvIGNhcnJ5IG91dCB0aGUgb3BlcmF0aW9uIHdoZW4gdGhlCiBhdXRvc3VzcGVuZCBpZGxlLWRlbGF5IGhhcyBleHBpcmVkLgogCi1BdXRvcmVzdW1lIGF0dGVtcHRzIGFsc28gY2FuIGZhaWwuICBUaGlzIHdpbGwgaGFwcGVuIGlmIHBvd2VyL2xldmVsIGlzCi1zZXQgdG8gInN1c3BlbmQiIG9yIGlmIHRoZSBkZXZpY2UgZG9lc24ndCBtYW5hZ2UgdG8gcmVzdW1lIHByb3Blcmx5LgotVW5saWtlIGF1dG9zdXNwZW5kLCB0aGVyZSdzIG5vIGRlbGF5IGZvciBhbiBhdXRvcmVzdW1lLgorQXV0b3Jlc3VtZSBhdHRlbXB0cyBhbHNvIGNhbiBmYWlsLCBhbHRob3VnaCBmYWlsdXJlIHdvdWxkIG1lYW4gdGhhdAordGhlIGRldmljZSBpcyBubyBsb25nZXIgcHJlc2VudCBvciBvcGVyYXRpbmcgcHJvcGVybHkuICBVbmxpa2UKK2F1dG9zdXNwZW5kLCB0aGVyZSdzIG5vIGRlbGF5IGZvciBhbiBhdXRvcmVzdW1lLgogCiAKIAlPdGhlciBwYXJ0cyBvZiB0aGUgZHJpdmVyIGludGVyZmFjZQpAQCAtNTI3LDEzICs1MjYsMyBAQAogcmVzdW1lIGFzIHNvb24gYXMgdGhlIHN5c3RlbSBzdXNwZW5kIGlzIGNvbXBsZXRlLiAgT3IgdGhlIHJlbW90ZQogd2FrZXVwIG1heSBmYWlsIGFuZCBnZXQgbG9zdC4gIFdoaWNoIG91dGNvbWUgb2NjdXJzIGRlcGVuZHMgb24gdGltaW5nCiBhbmQgb24gdGhlIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSBkZXNpZ24uCi0KLU1vcmUgaW50ZXJlc3RpbmdseSwgYSBkZXZpY2UgbWlnaHQgdW5kZXJnbyBhIG1hbnVhbCByZXN1bWUgb3IKLWF1dG9yZXN1bWUgZHVyaW5nIHN5c3RlbSBzdXNwZW5kLiAgV2l0aCBjdXJyZW50IGtlcm5lbHMgdGhpcyBzaG91bGRuJ3QKLWhhcHBlbiwgYmVjYXVzZSBtYW51YWwgcmVzdW1lcyBtdXN0IGJlIGluaXRpYXRlZCBieSB1c2Vyc3BhY2UgYW5kCi1hdXRvcmVzdW1lcyBoYXBwZW4gaW4gcmVzcG9uc2UgdG8gSS9PIHJlcXVlc3RzLCBidXQgYWxsIHVzZXIgcHJvY2Vzc2VzCi1hbmQgSS9PIHNob3VsZCBiZSBxdWllc2NlbnQgZHVyaW5nIGEgc3lzdGVtIHN1c3BlbmQgLS0gdGhhbmtzIHRvIHRoZQotZnJlZXplci4gIEhvd2V2ZXIgdGhlcmUgYXJlIHBsYW5zIHRvIGRvIGF3YXkgd2l0aCB0aGUgZnJlZXplciwgd2hpY2gKLXdvdWxkIG1lYW4gdGhlc2UgdGhpbmdzIHdvdWxkIGJlY29tZSBwb3NzaWJsZS4gIElmIGFuZCB3aGVuIHRoaXMgY29tZXMKLWFib3V0LCB0aGUgVVNCIGNvcmUgd2lsbCBjYXJlZnVsbHkgYXJyYW5nZSBtYXR0ZXJzIHNvIHRoYXQgZWl0aGVyIHR5cGUKLW9mIHJlc3VtZSB3aWxsIGJsb2NrIHVudGlsIHRoZSBlbnRpcmUgc3lzdGVtIGhhcyByZXN1bWVkLgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBkNTI0NGYxLi43NDU2NDNiIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMzY3OSw3ICszNjc5LDcgQEAKIE1VU0IgTVVMVElQT0lOVCBISUdIIFNQRUVEIERVQUwtUk9MRSBDT05UUk9MTEVSCiBNOglGZWxpcGUgQmFsYmkgPGZlbGlwZS5iYWxiaUBub2tpYS5jb20+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCi1UOglnaXQgZ2l0Oi8vZ2l0b3Jpb3VzLm9yZy9tdXNiL21haW5saW5lLmdpdAorVDoJZ2l0IGdpdDovL2dpdG9yaW91cy5vcmcvdXNiL3VzYi5naXQKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvdXNiL211c2IvCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfY29yZS5jIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9jb3JlLmMKaW5kZXggODQ0YzAyYy4uMGM4NjMyNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9jb3JlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9jb3JlLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CiAJZW51bSB1Y29kZV9zdGF0ZSB1c3RhdGU7CiAKLQlpZiAodWNpLT52YWxpZCAmJiB1Y2ktPm1jKQorCWlmICh1Y2ktPnZhbGlkKQogCQl1c3RhdGUgPSBtaWNyb2NvZGVfcmVzdW1lX2NwdShjcHUpOwogCWVsc2UKIAkJdXN0YXRlID0gbWljcm9jb2RlX2luaXRfY3B1KGNwdSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYnVzLmMgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKaW5kZXggNjNjMTQzZS4uYzBjNWE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2J1cy5jCisrKyBiL2RyaXZlcnMvYmFzZS9idXMuYwpAQCAtNzAzLDkgKzcwMyw5IEBACiAJcmV0dXJuIDA7CiAKIG91dF91bnJlZ2lzdGVyOgorCWtvYmplY3RfcHV0KCZwcml2LT5rb2JqKTsKIAlrZnJlZShkcnYtPnApOwogCWRydi0+cCA9IE5VTEw7Ci0Ja29iamVjdF9wdXQoJnByaXYtPmtvYmopOwogb3V0X3B1dF9idXM6CiAJYnVzX3B1dChidXMpOwogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCmluZGV4IGYxMjkwY2IuLjI4MjAyNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtNDQ2LDcgKzQ0Niw4IEBACiAgKiBAZGV2OiBkZXZpY2UuCiAgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZSBkZXNjcmlwdG9yLgogICovCi1pbnQgZGV2aWNlX2NyZWF0ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpCitpbnQgZGV2aWNlX2NyZWF0ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQogewogCWludCBlcnJvciA9IDA7CiAJaWYgKGRldikKQEAgLTQ1OSw3ICs0NjAsOCBAQAogICogQGRldjogZGV2aWNlLgogICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUgZGVzY3JpcHRvci4KICAqLwotdm9pZCBkZXZpY2VfcmVtb3ZlX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cikKK3ZvaWQgZGV2aWNlX3JlbW92ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCWNvbnN0IHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQogewogCWlmIChkZXYpCiAJCXN5c2ZzX3JlbW92ZV9maWxlKCZkZXYtPmtvYmosICZhdHRyLT5hdHRyKTsKQEAgLTQ3MCw3ICs0NzIsOCBAQAogICogQGRldjogZGV2aWNlLgogICogQGF0dHI6IGRldmljZSBiaW5hcnkgYXR0cmlidXRlIGRlc2NyaXB0b3IuCiAgKi8KLWludCBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIpCitpbnQgZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cikKIHsKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOwogCWlmIChkZXYpCkBAIC00ODQsNyArNDg3LDggQEAKICAqIEBkZXY6IGRldmljZS4KICAqIEBhdHRyOiBkZXZpY2UgYmluYXJ5IGF0dHJpYnV0ZSBkZXNjcmlwdG9yLgogICovCi12b2lkIGRldmljZV9yZW1vdmVfYmluX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cikKK3ZvaWQgZGV2aWNlX3JlbW92ZV9iaW5fZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgY29uc3Qgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIpCiB7CiAJaWYgKGRldikKIAkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZkZXYtPmtvYmosIGF0dHIpOwpAQCAtOTA1LDggKzkwOSwxMCBAQAogCQlkZXYtPmluaXRfbmFtZSA9IE5VTEw7CiAJfQogCi0JaWYgKCFkZXZfbmFtZShkZXYpKQorCWlmICghZGV2X25hbWUoZGV2KSkgeworCQllcnJvciA9IC1FSU5WQUw7CiAJCWdvdG8gbmFtZV9lcnJvcjsKKwl9CiAKIAlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGV2dG1wZnMuYyBiL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jCmluZGV4IDUwMzc1YmIuLjA5MGRkNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jCkBAIC0zMiw3ICszMiw3IEBACiBzdGF0aWMgaW50IGRldl9tb3VudDsKICNlbmRpZgogCi1zdGF0aWMgcndsb2NrX3QgZGlybG9jazsKK3N0YXRpYyBERUZJTkVfTVVURVgoZGlybG9jayk7CiAKIHN0YXRpYyBpbnQgX19pbml0IG1vdW50X3BhcmFtKGNoYXIgKnN0cikKIHsKQEAgLTkzLDcgKzkzLDcgQEAKIHsKIAlpbnQgZXJyOwogCi0JcmVhZF9sb2NrKCZkaXJsb2NrKTsKKwltdXRleF9sb2NrKCZkaXJsb2NrKTsKIAllcnIgPSBkZXZfbWtkaXIobm9kZXBhdGgsIDA3NTUpOwogCWlmIChlcnIgPT0gLUVOT0VOVCkgewogCQljaGFyICpwYXRoOwpAQCAtMTAxLDggKzEwMSwxMCBAQAogCiAJCS8qIHBhcmVudCBkaXJlY3RvcmllcyBkbyBub3QgZXhpc3QsIGNyZWF0ZSB0aGVtICovCiAJCXBhdGggPSBrc3RyZHVwKG5vZGVwYXRoLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYXRoKQotCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmICghcGF0aCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CiAJCXMgPSBwYXRoOwogCQlmb3IgKDs7KSB7CiAJCQlzID0gc3RyY2hyKHMsICcvJyk7CkBAIC0xMTcsNyArMTE5LDggQEAKIAkJfQogCQlrZnJlZShwYXRoKTsKIAl9Ci0JcmVhZF91bmxvY2soJmRpcmxvY2spOworb3V0OgorCW11dGV4X3VubG9jaygmZGlybG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjI5LDcgKzIzMiw3IEBACiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXdyaXRlX2xvY2soJmRpcmxvY2spOworCW11dGV4X2xvY2soJmRpcmxvY2spOwogCWZvciAoOzspIHsKIAkJY2hhciAqYmFzZTsKIApAQCAtMjQxLDcgKzI0NCw3IEBACiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAl9Ci0Jd3JpdGVfdW5sb2NrKCZkaXJsb2NrKTsKKwltdXRleF91bmxvY2soJmRpcmxvY2spOwogCiAJa2ZyZWUocGF0aCk7CiAJcmV0dXJuIGVycjsKQEAgLTM1Miw4ICszNTUsNiBAQAogCWludCBlcnI7CiAJc3RydWN0IHZmc21vdW50ICptbnQ7CiAKLQlyd2xvY2tfaW5pdCgmZGlybG9jayk7Ci0KIAllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZkZXZfZnNfdHlwZSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgImRldnRtcGZzOiB1bmFibGUgdG8gcmVnaXN0ZXIgZGV2dG1wZnMgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RyaXZlci5jIGIvZHJpdmVycy9iYXNlL2RyaXZlci5jCmluZGV4IGYzNjc4ODUuLjkwYzlmZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kcml2ZXIuYworKysgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKQEAgLTk4LDcgKzk4LDcgQEAKICAqIEBhdHRyOiBkcml2ZXIgYXR0cmlidXRlIGRlc2NyaXB0b3IuCiAgKi8KIGludCBkcml2ZXJfY3JlYXRlX2ZpbGUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKLQkJICAgICAgIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlICphdHRyKQorCQkgICAgICAgY29uc3Qgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKmF0dHIpCiB7CiAJaW50IGVycm9yOwogCWlmIChkcnYpCkBAIC0xMTUsNyArMTE1LDcgQEAKICAqIEBhdHRyOiBkcml2ZXIgYXR0cmlidXRlIGRlc2NyaXB0b3IuCiAgKi8KIHZvaWQgZHJpdmVyX3JlbW92ZV9maWxlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCi0JCQlzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqYXR0cikKKwkJCWNvbnN0IHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlICphdHRyKQogewogCWlmIChkcnYpCiAJCXN5c2ZzX3JlbW92ZV9maWxlKCZkcnYtPnAtPmtvYmosICZhdHRyLT5hdHRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggOWQyZWUyNS4uNThlZmFmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTQ0MSw2ICs0NDEsNyBAQAogCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CiAJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKTsKIAogc3RhdGljIGludCBwbGF0Zm9ybV9kcnZfcHJvYmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggMDkzZjU3YS4uOTRlYjg2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKQEAgLTg3LDggKzg3LDYgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZHJlYW0vS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZHN0L0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2IzZGZnL0tjb25maWciCkBAIC0xNDUsNSArMTQzLDcgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbmV0d2F2ZS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zbTd4eC9LY29uZmlnIgorCiBlbmRpZiAjICFTVEFHSU5HX0VYQ0xVREVfQlVJTEQKIGVuZGlmICMgU1RBR0lORwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCmluZGV4IDA2OTg2NGYuLmI1ZTY3YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDYgQEAKIG9iai0kKENPTkZJR19JTlBVVF9NSU1JTykJKz0gbWltaW8vCiBvYmotJChDT05GSUdfVFJBTlpQT1JUKQkJKz0gZnJvbnRpZXIvCiBvYmotJChDT05GSUdfRFJFQU0pCQkrPSBkcmVhbS8KLW9iai0kKENPTkZJR19EU1QpCQkrPSBkc3QvCiBvYmotJChDT05GSUdfUE9ITUVMRlMpCQkrPSBwb2htZWxmcy8KIG9iai0kKENPTkZJR19CM0RGRykJCSs9IGIzZGZnLwogb2JqLSQoQ09ORklHX0lERV9QSElTT04pCSs9IHBoaXNvbi8KQEAgLTUzLDMgKzUyLDQgQEAKIG9iai0kKENPTkZJR19XQVZFTEFOKQkJKz0gd2F2ZWxhbi8KIG9iai0kKENPTkZJR19QQ01DSUFfV0FWRUxBTikJKz0gd2F2ZWxhbi8KIG9iai0kKENPTkZJR19QQ01DSUFfTkVUV0FWRSkJKz0gbmV0d2F2ZS8KK29iai0kKENPTkZJR19GQl9TTTdYWCkJCSs9IHNtN3h4LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWcKaW5kZXggNzYzMmY1Ny4uMWQ3NGRhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnCkBAIC00LDYgKzQsNyBAQAogCiBjb25maWcgQkFUTUFOX0FEVgogCXRyaXN0YXRlICJCLkEuVC5NLkEuTi4gQWR2YW5jZWQgTWVzaGluZyBQcm90b2NvbCIKKwlkZXBlbmRzIG9uIFBST0NfRlMgJiYgUEFDS0VUCiAgICAgICAgIGRlZmF1bHQgbgogCS0tLWhlbHAtLS0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5jCmluZGV4IGQ3MjQ3OTguLmViNjE3NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmMKQEAgLTM2Myw4ICszNjMsMTAgQEAKIAkJcmV0dXJuOwogCiAJZm9yd19wYWNrZXQtPnBhY2tldF9idWZmID0ga21hbGxvYyhwYWNrZXRfbGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWZvcndfcGFja2V0LT5wYWNrZXRfYnVmZikKKwlpZiAoIWZvcndfcGFja2V0LT5wYWNrZXRfYnVmZikgeworCQlrZnJlZShmb3J3X3BhY2tldCk7CiAJCXJldHVybjsKKwl9CiAKIAlmb3J3X3BhY2tldC0+cGFja2V0X2xlbiA9IHBhY2tldF9sZW47CiAJbWVtY3B5KGZvcndfcGFja2V0LT5wYWNrZXRfYnVmZiwgcGFja2V0X2J1ZmYsIGZvcndfcGFja2V0LT5wYWNrZXRfbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oCmluZGV4IGNjYzVjZGMuLmI1NTlhOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGkuaApAQCAtNDUxLDcgKzQ1MSw3IEBACiAKICNkZWZpbmUgQ09NRURJX0NCX0VPUwkJMQkvKiBlbmQgb2Ygc2NhbiAqLwogI2RlZmluZSBDT01FRElfQ0JfRU9BCQkyCS8qIGVuZCBvZiBhY3F1aXNpdGlvbiAqLwotI2RlZmluZSBDT01FRElfQ0JfQkxPQ0sJCTQJLyogREVQUkVDQVRFRDogY29udmVuaWVudCBibG9jayBzaXplICovCisjZGVmaW5lIENPTUVESV9DQl9CTE9DSwkJNAkvKiBkYXRhIGhhcyBhcnJpdmVkOiB3YWtlcyB1cCByZWFkKCkgLyB3cml0ZSgpICovCiAjZGVmaW5lIENPTUVESV9DQl9FT0JVRgkJOAkvKiBERVBSRUNBVEVEOiBlbmQgb2YgYnVmZmVyICovCiAjZGVmaW5lIENPTUVESV9DQl9FUlJPUgkJMTYJLyogY2FyZCBlcnJvciBkdXJpbmcgYWNxdWlzaXRpb24gKi8KICNkZWZpbmUgQ09NRURJX0NCX09WRVJGTE9XCTMyCS8qIGJ1ZmZlciBvdmVyZmxvdy91bmRlcmZsb3cgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCmluZGV4IDBkMmMyZWIyMy4uYmQzOTc4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCkBAIC04NDksOCArODQ5LDExIEBACiAJfQogCiAJZGV2cHJpdi0+cGNpX2VuYWJsZWQgPSAxOwotCWRldnByaXYtPmlvYmFzZSA9Ci0JICAgIGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGNhcmQsIDApLCBzaXplb2Yoc3RydWN0IGpyM190KSk7CisJZGV2cHJpdi0+aW9iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoY2FyZCwgMCksCisJCQlvZmZzZXRvZihzdHJ1Y3QganIzX3QsIGNoYW5uZWxbZGV2cHJpdi0+bl9jaGFubmVsc10pKTsKKwlpZiAoIWRldnByaXYtPmlvYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXN1bHQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgZGV2cHJpdi0+bl9jaGFubmVscyk7CiAJaWYgKHJlc3VsdCA8IDApCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCmluZGV4IDA2YzAyMDQ2Li45YTFiNTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCkBAIC0xLDQgKzEsNCBAQAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjIuMyIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjQiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkJlcm5kIFBvcnIsIEJlcm5kUG9yckBmMnMuY29tIgogI2RlZmluZSBEUklWRVJfREVTQyAiU3RpcmxpbmcvSVRMIFVTQi1EVVggLS0gQmVybmQuUG9yckBmMnMuY29tIgogLyoKQEAgLTgxLDYgKzgxLDggQEAKICAqIDIuMTogIGNoYW5nZWQgUFdNIEFQSQogICogMi4yOiAgYWRkZWQgZmlybXdhcmUga2VybmVsIHJlcXVlc3QgdG8gZml4IGFuIHVkZXYgcHJvYmxlbQogICogMi4zOiAgY29ycmVjdGVkIGEgYnVnIGluIGJ1bGsgdGltZW91dHMgd2hpY2ggd2VyZSBmYXIgdG9vIHNob3J0CisgKiAyLjQ6ICBmaXhlZCBhIGJ1ZyB3aGljaCBjYXVzZXMgdGhlIGRyaXZlciB0byBoYW5nIHdoZW4gaXQgcmFuIG91dCBvZiBkYXRhLgorICogICAgICAgVGhhbmtzIHRvIEphbi1NYXR0aGlhcyBCcmF1biBhbmQgSWFuIHRvIHNwb3QgdGhlIGJ1ZyBhbmQgZml4IGl0LgogICoKICAqLwogCkBAIC01MzIsNiArNTM0LDcgQEAKIAkJfQogCX0KIAkvKiB0ZWxsIGNvbWVkaSB0aGF0IGRhdGEgaXMgdGhlcmUgKi8KKwlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSyB8IENPTUVESV9DQl9FT1M7CiAJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHN0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGQzNDIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotY29uZmlnIERTVAotCXRyaXN0YXRlICJEaXN0cmlidXRlZCBzdG9yYWdlIgotCWRlcGVuZHMgb24gTkVUICYmIENSWVBUTyAmJiBTWVNGUyAmJiBCTEtfREVWCi0Jc2VsZWN0IENPTk5FQ1RPUgotCS0tLWhlbHAtLS0KLQlEU1QgaXMgYSBuZXR3b3JrIGJsb2NrIGRldmljZSBzdG9yYWdlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBvcmdhbml6ZQotCWV4cG9ydGVkIHN0b3JhZ2Ugb24gdGhlIHJlbW90ZSBub2RlcyBpbnRvIHRoZSBsb2NhbCBibG9jayBkZXZpY2UuCi0KLQlEU1Qgd29ya3Mgb24gdG9wIG9mIGFueSBuZXR3b3JrIG1lZGlhIGFuZCBwcm90b2NvbDsgaXQgaXMganVzdCBhIG1hdHRlcgotCW9mIGNvbmZpZ3VyYXRpb24gdXRpbGl0eSB0byB1bmRlcnN0YW5kIHRoZSBjb3JyZWN0IGFkZHJlc3Nlcy4gVGhlIG1vc3QKLQljb21tb24gZXhhbXBsZSBpcyBUQ1Agb3ZlciBJUCwgd2hpY2ggYWxsb3dzIHRvIHBhc3MgdGhyb3VnaCBmaXJld2FsbHMgYW5kCi0JY3JlYXRlIHJlbW90ZSBiYWNrdXAgc3RvcmFnZSBpbiBhIGRpZmZlcmVudCBkYXRhY2VudGVyLiBEU1QgcmVxdWlyZXMKLQlzaW5nbGUgcG9ydCB0byBiZSBlbmFibGVkIG9uIHRoZSBleHBvcnRpbmcgbm9kZSBhbmQgb3V0Z29pbmcgY29ubmVjdGlvbnMKLQlvbiB0aGUgbG9jYWwgbm9kZS4KLQotCURTVCB3b3JrcyB3aXRoIGluLWtlcm5lbCBjbGllbnQgYW5kIHNlcnZlciwgd2hpY2ggaW1wcm92ZXMgcGVyZm9ybWFuY2UgYnkKLQllbGltaW5hdGluZyB1bm5lZGVkIGRhdGEgY29waWVzIGFuZCBieSBub3QgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uCi0Jb2YgdGhlIGV4dGVybmFsIElPIGNvbXBvbmVudHMuIEl0IHJlcXVpcmVzIHVzZXJzcGFjZSBjb25maWd1cmF0aW9uIHV0aWxpdHkKLQl0aG91Z2guCi0KLQlEU1QgdXNlcyB0cmFuc2FjdGlvbiBtb2RlbCwgd2hlbiBlYWNoIHN0b3JlIGhhcyB0byBiZSBleHBsaWNpdGx5IGFja2VkCi0JZnJvbSB0aGUgcmVtb3RlIG5vZGUgdG8gYmUgY29uc2lkZXJlZCBhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbi4gVGhlcmUKLQltYXkgYmUgbG90cyBvZiBpbi1mbGlnaHQgdHJhbnNhY3Rpb25zLiBXaGVuIHJlbW90ZSBob3N0IGRvZXMgbm90IGFjawotCXRoZSB0cmFuc2FjdGlvbiBpdCB3aWxsIGJlIHJlc2VudCBwcmVkZWZpbmVkIG51bWJlciBvZiB0aW1lcyB3aXRoIHNwZWNpZmllZAotCXRpbWVvdXRzIGJldHdlZW4gdGhlbS4gQWxsIHRob3NlIHBhcmFtZXRlcnMgYXJlIGNvbmZpZ3VyYWJsZS4gVHJhbnNhY3Rpb25zCi0JYXJlIG1hcmtlZCBhcyBmYWlsZWQgYWZ0ZXIgYWxsIHJlc2VuZHMgY29tcGxldGUgdW5zdWNjZXNzZnVsbHk7IGhhdmluZwotCWxvbmcgZW5vdWdoIHJlc2VuZCB0aW1lb3V0IGFuZC9vciBsYXJnZSBudW1iZXIgb2YgcmVzZW5kcyBhbGxvd3Mgbm90IHRvCi0JcmV0dXJuIGVycm9yIHRvIHRoZSBoaWdoZXIgKEZTIHVzdWFsbHkpIGxheWVyIGluIGNhc2Ugb2Ygc2hvcnQgbmV0d29yawotCXByb2JsZW1zIG9yIHJlbW90ZSBub2RlIG91dGFnZXMuIEluIGNhc2Ugb2YgbmV0d29yayBSQUlEIHNldHVwIHRoaXMgbWVhbnMKLQl0aGF0IHN0b3JhZ2Ugd2lsbCBub3QgZGVncmFkZSB1bnRpbCB0cmFuc2FjdGlvbnMgYXJlIG1hcmtlZCBhcyBmYWlsZWQsIGFuZAotCXRodXMgd2lsbCBub3QgZm9yY2UgY2hlY2tzdW0gcmVjYWxjdWxhdGlvbiBhbmQgZGF0YSByZWJ1aWxkLiBJbiBjYXNlIG9mCi0JY29ubmVjdGlvbiBmYWlsdXJlIERTVCB3aWxsIHRyeSB0byByZWNvbm5lY3QgdG8gdGhlIHJlbW90ZSBub2RlIGF1dG9tYXRpY2FsbHkuCi0JRFNUIHNlbmRzIHBpbmcgY29tbWFuZHMgYXQgaWRsZSB0aW1lIHRvIGRldGVjdCBpZiByZW1vdGUgbm9kZSBpcyBhbGl2ZS4KLQotCUJlY2F1c2Ugb2YgdHJhbnNhY3Rpb25hbCBtb2RlbCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgemVyby1jb3B5IHNlbmRpbmcKLQl3aXRob3V0IHdvcnJ5IG9mIGRhdGEgY29ycnVwdGlvbiAod2hpY2ggaW4gdHVybiBjb3VsZCBiZSBkZXRlY3RlZCBieSB0aGUKLQlzdHJvbmcgY2hlY2tzdW1zIHRob3VnaCkuCi0KLQlEU1QgbWF5IGZ1bGx5IGVuY3J5cHQgdGhlIGRhdGEgY2hhbm5lbCBpbiBjYXNlIG9mIHVudHJ1c3RlZCBjaGFubmVsIGFuZCBpbXBsZW1lbnQKLQlzdHJvbmcgY2hlY2tzdW0gb2YgdGhlIHRyYW5zZmVycmVkIGRhdGEuIEl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSBhbGdvcml0aG1zCi0JYW5kIGNyeXB0byBrZXlzOyB0aGV5IHNob3VsZCBtYXRjaCBvbiBib3RoIHNpZGVzIG9mIHRoZSBuZXR3b3JrIGNoYW5uZWwuCi0JQ3J5cHRvIHByb2Nlc3NpbmcgZG9lcyBub3QgaW50cm9kdWNlIG5vdGljZWJsZSBwZXJmb3JtYW5jZSBvdmVyaGVhZCwgc2luY2UgRFNUCi0JdXNlcyBjb25maWd1cmFibGUgcG9vbCBvZiB0aHJlYWRzIHRvIHBlcmZvcm0gY3J5cHRvIHByb2Nlc3NpbmcuCi0KLQlEU1QgdXRpbGl6ZXMgbWVtb3J5IHBvb2wgbW9kZWwgb2YgYWxsIGl0cyB0cmFuc2FjdGlvbiBhbGxvY2F0aW9ucyAoaXQgaXMgdGhlCi0Jb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gb24gdGhlIGNsaWVudCkgYW5kIHNlcnZlciBhbGxvY2F0aW9ucyAoYmlvIHBvb2xzLAotCXdoaWxlIHBhZ2VzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUgc2xhYikuCi0KLQlBdCBzdGFydHVwIERTVCBwZXJmb3JtcyBhIHNpbXBsZSBuZWdvdGlhdGlvbiB3aXRoIHRoZSBleHBvcnQgbm9kZSB0byBkZXRlcm1pbmUKLQlhY2Nlc3MgcGVybWlzc2lvbnMgYW5kIHNpemUgb2YgdGhlIGV4cG9ydGVkIHN0b3JhZ2UuIEl0IGNhbiBiZSBleHRlbmRlZCBpZgotCW5ldyBwYXJhbWV0ZXJzIHNob3VsZCBiZSBhdXRvbmVnb3RpYXRlZC4KLQotCURTVCBjYXJyaWVzIGJsb2NrIElPIGZsYWdzIGluIHRoZSBwcm90b2NvbCwgd2hpY2ggYWxsb3dzIHRvIHRyYW5zcGFyZW50bHkgaW1wbGVtZW50Ci0JYmFycmllcnMgYW5kIHN5bmMvZmx1c2ggb3BlcmF0aW9ucy4gVGhvc2UgZmxhZ3MgYXJlIHVzZWQgaW4gdGhlIGV4cG9ydCBub2RlIHdoZXJlCi0JSU8gYWdhaW5zdCB0aGUgbG9jYWwgc3RvcmFnZSBpcyBwZXJmb3JtZWQsIHdoaWNoIG1lYW5zIHRoYXQgc3luYyB3cml0ZSB3aWxsIGJlIHN5bmMKLQlvbiB0aGUgcmVtb3RlIG5vZGUgdG9vLCB3aGljaCBpbiB0dXJuIGltcHJvdmVzIGRhdGEgaW50ZWdyaXR5IGFuZCBpbXByb3ZlZCByZXNpc3RhbmNlCi0JdG8gZXJyb3JzIGFuZCBkYXRhIGNvcnJ1cHRpb24gZHVyaW5nIHBvd2VyIG91dGFnZXMgb3Igc3RvcmFnZSBkYW1hZ2VzLgotCi0JSG9tZXBhZ2U6IGh0dHA6Ly93d3cuaW9yZW1hcC5uZXQvcHJvamVjdHMvZHN0Ci0JVXNlcnNwYWNlIGNvbmZpZ3VyYXRpb24gdXRpbGl0eSBhbmQgdGhlIGxhdGVzdCByZWxlYXNlczogaHR0cDovL3d3dy5pb3JlbWFwLm5ldC9hcmNoaXZlL2RzdC8KLQotY29uZmlnIERTVF9ERUJVRwotCWJvb2wgIkRTVCBkZWJ1ZyIKLQlkZXBlbmRzIG9uIERTVAotCS0tLWhlbHAtLS0KLQlUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBIRUFWWSBkZWJ1Z2dpbmcgb2YgdGhlIERTVC4KLQlUdXJuIGl0IG9uIE9OTFkgaWYgeW91IGhhdmUgdG8gZGVidWcgc29tZSByZWFsbHkgb2JzY3VyZSBwcm9ibGVtLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGIwY2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb2JqLSQoQ09ORklHX0RTVCkgKz0gbnN0Lm8KLQotbnN0LXkgOj0gZGNvcmUubyBzdGF0ZS5vIGV4cG9ydC5vIHRocmVhZF9wb29sLm8gY3J5cHRvLm8gdHJhbnMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC9jcnlwdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvY3J5cHRvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTI5NWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9jcnlwdG8uYworKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKgotICogMjAwNysgQ29weXJpZ2h0IChjKSBFdmdlbml5IFBvbHlha292IDx6YnJAaW9yZW1hcC5uZXQ+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvYmlvLmg+Ci0jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSA8bGludXgvZHN0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLS8qCi0gKiBUcmlja3kgYmFzdGFyZCwgYnV0IElWIGNhbiBiZSBtb3JlIGNvbXBsZXggd2l0aCB0aW1lLi4uCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTY0IGRzdF9nZW5faXYoc3RydWN0IGRzdF90cmFucyAqdCkKLXsKLQlyZXR1cm4gdC0+Z2VuOwotfQotCi0vKgotICogQ3J5cHRvIG1hY2hpbmVyeTogaGFzaC9jaXBoZXIgc3VwcG9ydCBmb3IgdGhlIGdpdmVuIGNyeXB0byBjb250cm9scy4KLSAqLwotc3RhdGljIHN0cnVjdCBjcnlwdG9faGFzaCAqZHN0X2luaXRfaGFzaChzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCwgdTggKmtleSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBjcnlwdG9faGFzaCAqaGFzaDsKLQotCWhhc2ggPSBjcnlwdG9fYWxsb2NfaGFzaChjdGwtPmhhc2hfYWxnbywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7Ci0JaWYgKElTX0VSUihoYXNoKSkgewotCQllcnIgPSBQVFJfRVJSKGhhc2gpOwotCQlkcHJpbnRrKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGhhc2ggJyVzJywgZXJyOiAlZC5cbiIsCi0JCQkJX19mdW5jX18sIGN0bC0+aGFzaF9hbGdvLCBlcnIpOwotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQl9Ci0KLQljdGwtPmNyeXB0b19hdHRhY2hlZF9zaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShoYXNoKTsKLQotCWlmICghY3RsLT5oYXNoX2tleXNpemUpCi0JCXJldHVybiBoYXNoOwotCi0JZXJyID0gY3J5cHRvX2hhc2hfc2V0a2V5KGhhc2gsIGtleSwgY3RsLT5oYXNoX2tleXNpemUpOwotCWlmIChlcnIpIHsKLQkJZHByaW50aygiJXM6IGZhaWxlZCB0byBzZXQga2V5IGZvciBoYXNoICclcycsIGVycjogJWQuXG4iLAotCQkJCV9fZnVuY19fLCBjdGwtPmhhc2hfYWxnbywgZXJyKTsKLQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0JfQotCi0JcmV0dXJuIGhhc2g7Ci0KLWVycl9vdXRfZnJlZToKLQljcnlwdG9fZnJlZV9oYXNoKGhhc2gpOwotZXJyX291dF9leGl0OgotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmRzdF9pbml0X2NpcGhlcihzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCwKLQkJdTggKmtleSkKLXsKLQlpbnQgZXJyID0gLUVJTlZBTDsKLQlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmNpcGhlcjsKLQotCWlmICghY3RsLT5jaXBoZXJfa2V5c2l6ZSkKLQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0KLQljaXBoZXIgPSBjcnlwdG9fYWxsb2NfYWJsa2NpcGhlcihjdGwtPmNpcGhlcl9hbGdvLCAwLCAwKTsKLQlpZiAoSVNfRVJSKGNpcGhlcikpIHsKLQkJZXJyID0gUFRSX0VSUihjaXBoZXIpOwotCQlkcHJpbnRrKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGNpcGhlciAnJXMnLCBlcnI6ICVkLlxuIiwKLQkJCQlfX2Z1bmNfXywgY3RsLT5jaXBoZXJfYWxnbywgZXJyKTsKLQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0JfQotCi0JY3J5cHRvX2FibGtjaXBoZXJfY2xlYXJfZmxhZ3MoY2lwaGVyLCB+MCk7Ci0KLQllcnIgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkoY2lwaGVyLCBrZXksIGN0bC0+Y2lwaGVyX2tleXNpemUpOwotCWlmIChlcnIpIHsKLQkJZHByaW50aygiJXM6IGZhaWxlZCB0byBzZXQga2V5IGZvciBjaXBoZXIgJyVzJywgZXJyOiAlZC5cbiIsCi0JCQkJX19mdW5jX18sIGN0bC0+Y2lwaGVyX2FsZ28sIGVycik7Ci0JCWdvdG8gZXJyX291dF9mcmVlOwotCX0KLQotCXJldHVybiBjaXBoZXI7Ci0KLWVycl9vdXRfZnJlZToKLQljcnlwdG9fZnJlZV9hYmxrY2lwaGVyKGNpcGhlcik7Ci1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotLyoKLSAqIENyeXB0byBlbmdpbmUgaGFzIGEgcG9vbCBvZiBwYWdlcyB0byBlbmNyeXB0IGRhdGEgaW50byBiZWZvcmUgc2VuZGluZwotICogaXQgb3ZlciB0aGUgbmV0d29yay4gVGhpcyBwb29sIGlzIGZyZWVkL2FsbG9jYXRlZCBoZXJlLgotICovCi1zdGF0aWMgdm9pZCBkc3RfY3J5cHRvX3BhZ2VzX2ZyZWUoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGUtPnBhZ2VfbnVtOyArK2kpCi0JCV9fZnJlZV9wYWdlKGUtPnBhZ2VzW2ldKTsKLQlrZnJlZShlLT5wYWdlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgZHN0X2NyeXB0b19wYWdlc19hbGxvYyhzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsIGludCBudW0pCi17Ci0JaW50IGk7Ci0KLQllLT5wYWdlcyA9IGttYWxsb2MobnVtICogc2l6ZW9mKHN0cnVjdCBwYWdlICoqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlLT5wYWdlcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKLQkJZS0+cGFnZXNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAoIWUtPnBhZ2VzW2ldKQotCQkJZ290byBlcnJfb3V0X2ZyZWVfcGFnZXM7Ci0JfQotCi0JZS0+cGFnZV9udW0gPSBudW07Ci0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZnJlZV9wYWdlczoKLQl3aGlsZSAoLS1pID49IDApCi0JCV9fZnJlZV9wYWdlKGUtPnBhZ2VzW2ldKTsKLQotCWtmcmVlKGUtPnBhZ2VzKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgY3J5cHRvIGVuZ2luZSBmb3IgZ2l2ZW4gbm9kZS4KLSAqIFNldHVwIGNpcGhlci9oYXNoLCBrZXlzLCBwb29sIG9mIHRocmVhZHMgYW5kIHByaXZhdGUgZGF0YS4KLSAqLwotc3RhdGljIGludCBkc3RfY3J5cHRvX2VuZ2luZV9pbml0KHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKLQkJc3RydWN0IGRzdF9ub2RlICpuKQotewotCWludCBlcnI7Ci0Jc3RydWN0IGRzdF9jcnlwdG9fY3RsICpjdGwgPSAmbi0+Y3J5cHRvOwotCi0JZXJyID0gZHN0X2NyeXB0b19wYWdlc19hbGxvYyhlLCBuLT5tYXhfcGFnZXMpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF9leGl0OwotCi0JZS0+c2l6ZSA9IFBBR0VfU0laRTsKLQllLT5kYXRhID0ga21hbGxvYyhlLT5zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWUtPmRhdGEpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfcGFnZXM7Ci0JfQotCi0JaWYgKGN0bC0+aGFzaF9hbGdvWzBdKSB7Ci0JCWUtPmhhc2ggPSBkc3RfaW5pdF9oYXNoKGN0bCwgbi0+aGFzaF9rZXkpOwotCQlpZiAoSVNfRVJSKGUtPmhhc2gpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGUtPmhhc2gpOwotCQkJZS0+aGFzaCA9IE5VTEw7Ci0JCQlnb3RvIGVycl9vdXRfZnJlZTsKLQkJfQotCX0KLQotCWlmIChjdGwtPmNpcGhlcl9hbGdvWzBdKSB7Ci0JCWUtPmNpcGhlciA9IGRzdF9pbml0X2NpcGhlcihjdGwsIG4tPmNpcGhlcl9rZXkpOwotCQlpZiAoSVNfRVJSKGUtPmNpcGhlcikpIHsKLQkJCWVyciA9IFBUUl9FUlIoZS0+Y2lwaGVyKTsKLQkJCWUtPmNpcGhlciA9IE5VTEw7Ci0JCQlnb3RvIGVycl9vdXRfZnJlZV9oYXNoOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZnJlZV9oYXNoOgotCWNyeXB0b19mcmVlX2hhc2goZS0+aGFzaCk7Ci1lcnJfb3V0X2ZyZWU6Ci0Ja2ZyZWUoZS0+ZGF0YSk7Ci1lcnJfb3V0X2ZyZWVfcGFnZXM6Ci0JZHN0X2NyeXB0b19wYWdlc19mcmVlKGUpOwotZXJyX291dF9leGl0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIGRzdF9jcnlwdG9fZW5naW5lX2V4aXQoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplKQotewotCWlmIChlLT5oYXNoKQotCQljcnlwdG9fZnJlZV9oYXNoKGUtPmhhc2gpOwotCWlmIChlLT5jaXBoZXIpCi0JCWNyeXB0b19mcmVlX2FibGtjaXBoZXIoZS0+Y2lwaGVyKTsKLQlkc3RfY3J5cHRvX3BhZ2VzX2ZyZWUoZSk7Ci0Ja2ZyZWUoZS0+ZGF0YSk7Ci19Ci0KLS8qCi0gKiBXYWl0aW5nIGZvciBjaXBoZXIgcHJvY2Vzc2luZyB0byBiZSBjb21wbGV0ZWQuCi0gKi8KLXN0cnVjdCBkc3RfY3J5cHRvX2NvbXBsZXRpb24gewotCXN0cnVjdCBjb21wbGV0aW9uCQljb21wbGV0ZTsKLQlpbnQJCQkJZXJyb3I7Ci19OwotCi1zdGF0aWMgdm9pZCBkc3RfY3J5cHRvX2NvbXBsZXRlKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLCBpbnQgZXJyKQotewotCXN0cnVjdCBkc3RfY3J5cHRvX2NvbXBsZXRpb24gKmMgPSByZXEtPmRhdGE7Ci0KLQlpZiAoZXJyID09IC1FSU5QUk9HUkVTUykKLQkJcmV0dXJuOwotCi0JZHByaW50aygiJXM6IHJlcTogJXAsIGVycjogJWQuXG4iLCBfX2Z1bmNfXywgcmVxLCBlcnIpOwotCWMtPmVycm9yID0gZXJyOwotCWNvbXBsZXRlKCZjLT5jb21wbGV0ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZHN0X2NyeXB0b19wcm9jZXNzKHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcSwKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19kc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfc3JjLAotCQl2b2lkICppdiwgaW50IGVuYywgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQotewotCXN0cnVjdCBkc3RfY3J5cHRvX2NvbXBsZXRpb24gYzsKLQlpbnQgZXJyOwotCi0JaW5pdF9jb21wbGV0aW9uKCZjLmNvbXBsZXRlKTsKLQljLmVycm9yID0gLUVJTlBST0dSRVNTOwotCi0JYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLAotCQkJCQlkc3RfY3J5cHRvX2NvbXBsZXRlLCAmYyk7Ci0KLQlhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2dfc3JjLCBzZ19kc3QsIHNnX3NyYy0+bGVuZ3RoLCBpdik7Ci0KLQlpZiAoZW5jKQotCQllcnIgPSBjcnlwdG9fYWJsa2NpcGhlcl9lbmNyeXB0KHJlcSk7Ci0JZWxzZQotCQllcnIgPSBjcnlwdG9fYWJsa2NpcGhlcl9kZWNyeXB0KHJlcSk7Ci0KLQlzd2l0Y2ggKGVycikgewotCWNhc2UgLUVJTlBST0dSRVNTOgotCWNhc2UgLUVCVVNZOgotCQllcnIgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmYy5jb21wbGV0ZSwKLQkJCQl0aW1lb3V0KTsKLQkJaWYgKCFlcnIpCi0JCQllcnIgPSAtRVRJTUVET1VUOwotCQllbHNlCi0JCQllcnIgPSBjLmVycm9yOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogRFNUIHVzZXMgZ2VuZXJpYyBpdGVyYXRpb24gYXBwcm9hY2ggZm9yIGRhdGEgY3J5cHRvIHByb2Nlc3NpbmcuCi0gKiBTaW5nbGUgYmxvY2sgSU8gcmVxdWVzdCBpcyBzd2l0Y2hlZCBpbnRvIGFycmF5IG9mIHNjYXR0ZXJsaXN0cywKLSAqIHdoaWNoIGFyZSBzdWJtaXR0ZWQgdG8gdGhlIGNyeXB0byBwcm9jZXNzaW5nIGl0ZXJhdG9yLgotICoKLSAqIElucHV0IGFuZCBvdXRwdXQgaXRlcmF0b3IgaW5pdGlhbGl6YXRpb24gYXJlIGRpZmZlcmVudCwgc2luY2UKLSAqIGluIG91dHB1dCBjYXNlIHdlIGNhbiBub3QgZW5jcnlwdCBkYXRhIGluLXBsYWNlIGFuZCBuZWVkIGEKLSAqIHRlbXBvcmFyeSBzdG9yYWdlLCB3aGljaCBpcyB0aGVuIGJlaW5nIHNlbnQgdG8gdGhlIHJlbW90ZSBwZWVyLgotICovCi1zdGF0aWMgaW50IGRzdF90cmFuc19pdGVyX291dChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKLQkJaW50ICgqaXRlcmF0b3IpIChzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsCi0JCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjKSkKLXsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0JaW50IGVyciwgaTsKLQotCXNnX2luaXRfdGFibGUoZS0+c3JjLCBiaW8tPmJpX3ZjbnQpOwotCXNnX2luaXRfdGFibGUoZS0+ZHN0LCBiaW8tPmJpX3ZjbnQpOwotCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaSkgewotCQlzZ19zZXRfcGFnZSgmZS0+c3JjW2ldLCBidi0+YnZfcGFnZSwgYnYtPmJ2X2xlbiwgYnYtPmJ2X29mZnNldCk7Ci0JCXNnX3NldF9wYWdlKCZlLT5kc3RbaV0sIGUtPnBhZ2VzW2ldLCBidi0+YnZfbGVuLCBidi0+YnZfb2Zmc2V0KTsKLQotCQllcnIgPSBpdGVyYXRvcihlLCAmZS0+ZHN0W2ldLCAmZS0+c3JjW2ldKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHN0X3RyYW5zX2l0ZXJfaW4oc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsCi0JCWludCAoKml0ZXJhdG9yKSAoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLAotCQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYykpCi17Ci0Jc3RydWN0IGJpb192ZWMgKmJ2OwotCWludCBlcnIsIGk7Ci0KLQlzZ19pbml0X3RhYmxlKGUtPnNyYywgYmlvLT5iaV92Y250KTsKLQlzZ19pbml0X3RhYmxlKGUtPmRzdCwgYmlvLT5iaV92Y250KTsKLQotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGkpIHsKLQkJc2dfc2V0X3BhZ2UoJmUtPnNyY1tpXSwgYnYtPmJ2X3BhZ2UsIGJ2LT5idl9sZW4sIGJ2LT5idl9vZmZzZXQpOwotCQlzZ19zZXRfcGFnZSgmZS0+ZHN0W2ldLCBidi0+YnZfcGFnZSwgYnYtPmJ2X2xlbiwgYnYtPmJ2X29mZnNldCk7Ci0KLQkJZXJyID0gaXRlcmF0b3IoZSwgJmUtPmRzdFtpXSwgJmUtPnNyY1tpXSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRzdF9jcnlwdF9pdGVyYXRvcihzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsCi0JCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfZHN0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3NyYykKLXsKLQlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEgPSBlLT5kYXRhOwotCXU4IGl2WzMyXTsKLQotCW1lbXNldChpdiwgMCwgc2l6ZW9mKGl2KSk7Ci0KLQltZW1jcHkoaXYsICZlLT5pdiwgc2l6ZW9mKGUtPml2KSk7Ci0KLQlyZXR1cm4gZHN0X2NyeXB0b19wcm9jZXNzKHJlcSwgc2dfZHN0LCBzZ19zcmMsIGl2LCBlLT5lbmMsIGUtPnRpbWVvdXQpOwotfQotCi1zdGF0aWMgaW50IGRzdF9jcnlwdChzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsIHN0cnVjdCBiaW8gKmJpbykKLXsKLQlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEgPSBlLT5kYXRhOwotCi0JbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QpKTsKLQlhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X3RmbShyZXEsIGUtPmNpcGhlcik7Ci0KLQlpZiAoZS0+ZW5jKQotCQlyZXR1cm4gZHN0X3RyYW5zX2l0ZXJfb3V0KGJpbywgZSwgZHN0X2NyeXB0X2l0ZXJhdG9yKTsKLQllbHNlCi0JCXJldHVybiBkc3RfdHJhbnNfaXRlcl9pbihiaW8sIGUsIGRzdF9jcnlwdF9pdGVyYXRvcik7Ci19Ci0KLXN0YXRpYyBpbnQgZHN0X2hhc2hfaXRlcmF0b3Ioc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLAotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2RzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19zcmMpCi17Ci0JcmV0dXJuIGNyeXB0b19oYXNoX3VwZGF0ZShlLT5kYXRhLCBzZ19zcmMsIHNnX3NyYy0+bGVuZ3RoKTsKLX0KLQotc3RhdGljIGludCBkc3RfaGFzaChzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsIHN0cnVjdCBiaW8gKmJpbywgdm9pZCAqZHN0KQotewotCXN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MgPSBlLT5kYXRhOwotCWludCBlcnI7Ci0KLQlkZXNjLT50Zm0gPSBlLT5oYXNoOwotCWRlc2MtPmZsYWdzID0gMDsKLQotCWVyciA9IGNyeXB0b19oYXNoX2luaXQoZGVzYyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IGRzdF90cmFuc19pdGVyX2luKGJpbywgZSwgZHN0X2hhc2hfaXRlcmF0b3IpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBjcnlwdG9faGFzaF9maW5hbChkZXNjLCBkc3QpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUvY2xlYW51cCBhIGNyeXB0byB0aHJlYWQuIFRoZSBvbmx5IHRoaW5nIGl0IHNob3VsZAotICogZG8gaXMgdG8gYWxsb2NhdGUgYSBwb29sIG9mIHBhZ2VzIGFzIHRlbXBvcmFyeSBzdG9yYWdlLgotICogQW5kIHRvIHNldHVwIGNpcGhlciBhbmQvb3IgaGFzaC4KLSAqLwotc3RhdGljIHZvaWQgKmRzdF9jcnlwdG9fdGhyZWFkX2luaXQodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSBkYXRhOwotCXN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZTsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWUpCi0JCWdvdG8gZXJyX291dF9leGl0OwotCWUtPnNyYyA9IGtjYWxsb2MoMiAqIG4tPm1heF9wYWdlcywgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCksCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWUtPnNyYykKLQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0KLQllLT5kc3QgPSBlLT5zcmMgKyBuLT5tYXhfcGFnZXM7Ci0KLQllcnIgPSBkc3RfY3J5cHRvX2VuZ2luZV9pbml0KGUsIG4pOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF9mcmVlX2FsbDsKLQotCXJldHVybiBlOwotCi1lcnJfb3V0X2ZyZWVfYWxsOgotCWtmcmVlKGUtPnNyYyk7Ci1lcnJfb3V0X2ZyZWU6Ci0Ja2ZyZWUoZSk7Ci1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotc3RhdGljIHZvaWQgZHN0X2NyeXB0b190aHJlYWRfY2xlYW51cCh2b2lkICpwcml2YXRlKQotewotCXN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSA9IHByaXZhdGU7Ci0KLQlkc3RfY3J5cHRvX2VuZ2luZV9leGl0KGUpOwotCWtmcmVlKGUtPnNyYyk7Ci0Ja2ZyZWUoZSk7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIGNyeXB0byBlbmdpbmUgZm9yIGdpdmVuIG5vZGU6IHN0b3JlIGtleXMsIGNyZWF0ZSBwb29sCi0gKiBvZiB0aHJlYWRzLCBpbml0aWFsaXplIGVhY2ggb25lLgotICoKLSAqIEVhY2ggdGhyZWFkIGhhcyB1bmlxdWUgSUQsIGJ1dCAwIGFuZCAxIGFyZSByZXNlcnZlZCBmb3IgcmVjZWl2aW5nIGFuZAotICogYWNjZXB0aW5nIHRocmVhZHMgKGlmIGV4cG9ydCBub2RlKSwgc28gSURzIGNvdWxkIHN0YXJ0IGZyb20gMiwgYnV0IHN0YXJ0aW5nCi0gKiB0aGVtIGZyb20gMTAgYWxsb3dzIGVhc2lseSB1bmRlcnN0YW5kIHdoYXQgdGhpcyB0aHJlYWQgaXMgZm9yLgotICovCi1pbnQgZHN0X25vZGVfY3J5cHRvX2luaXQoc3RydWN0IGRzdF9ub2RlICpuLCBzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCkKLXsKLQl2b2lkICprZXkgPSAoY3RsICsgMSk7Ci0JaW50IGVyciA9IC1FTk9NRU0sIGk7Ci0JY2hhciBuYW1lWzMyXTsKLQotCWlmIChjdGwtPmhhc2hfa2V5c2l6ZSkgewotCQluLT5oYXNoX2tleSA9IGttYWxsb2MoY3RsLT5oYXNoX2tleXNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIW4tPmhhc2hfa2V5KQotCQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0JCW1lbWNweShuLT5oYXNoX2tleSwga2V5LCBjdGwtPmhhc2hfa2V5c2l6ZSk7Ci0JfQotCi0JaWYgKGN0bC0+Y2lwaGVyX2tleXNpemUpIHsKLQkJbi0+Y2lwaGVyX2tleSA9IGttYWxsb2MoY3RsLT5jaXBoZXJfa2V5c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbi0+Y2lwaGVyX2tleSkKLQkJCWdvdG8gZXJyX291dF9mcmVlX2hhc2g7Ci0JCW1lbWNweShuLT5jaXBoZXJfa2V5LCBrZXksIGN0bC0+Y2lwaGVyX2tleXNpemUpOwotCX0KLQltZW1jcHkoJm4tPmNyeXB0bywgY3RsLCBzaXplb2Yoc3RydWN0IGRzdF9jcnlwdG9fY3RsKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY3RsLT50aHJlYWRfbnVtOyArK2kpIHsKLQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMtY3J5cHRvLSVkIiwgbi0+bmFtZSwgaSk7Ci0JCS8qIFVuaXF1ZSBpZHMuLi4gKi8KLQkJZXJyID0gdGhyZWFkX3Bvb2xfYWRkX3dvcmtlcihuLT5wb29sLCBuYW1lLCBpICsgMTAsCi0JCQlkc3RfY3J5cHRvX3RocmVhZF9pbml0LCBkc3RfY3J5cHRvX3RocmVhZF9jbGVhbnVwLCBuKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dF9mcmVlX3RocmVhZHM7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZnJlZV90aHJlYWRzOgotCXdoaWxlICgtLWkgPj0gMCkKLQkJdGhyZWFkX3Bvb2xfZGVsX3dvcmtlcl9pZChuLT5wb29sLCBpKzEwKTsKLQotCWlmIChjdGwtPmNpcGhlcl9rZXlzaXplKQotCQlrZnJlZShuLT5jaXBoZXJfa2V5KTsKLQljdGwtPmNpcGhlcl9rZXlzaXplID0gMDsKLWVycl9vdXRfZnJlZV9oYXNoOgotCWlmIChjdGwtPmhhc2hfa2V5c2l6ZSkKLQkJa2ZyZWUobi0+aGFzaF9rZXkpOwotCWN0bC0+aGFzaF9rZXlzaXplID0gMDsKLWVycl9vdXRfZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi12b2lkIGRzdF9ub2RlX2NyeXB0b19leGl0KHN0cnVjdCBkc3Rfbm9kZSAqbikKLXsKLQlzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCA9ICZuLT5jcnlwdG87Ci0KLQlpZiAoY3RsLT5jaXBoZXJfYWxnb1swXSB8fCBjdGwtPmhhc2hfYWxnb1swXSkgewotCQlrZnJlZShuLT5oYXNoX2tleSk7Ci0JCWtmcmVlKG4tPmNpcGhlcl9rZXkpOwotCX0KLX0KLQotLyoKLSAqIFRocmFkIHBvb2wgc2V0dXAgY2FsbGJhY2suIEp1c3Qgc3RvcmVzIGEgdHJhbnNhY3Rpb24gaW4gcHJpdmF0ZSBkYXRhLgotICovCi1zdGF0aWMgaW50IGRzdF90cmFuc19jcnlwdG9fc2V0dXAodm9pZCAqY3J5cHRvX2VuZ2luZSwgdm9pZCAqdHJhbnMpCi17Ci0Jc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplID0gY3J5cHRvX2VuZ2luZTsKLQotCWUtPnByaXZhdGUgPSB0cmFuczsKLQlyZXR1cm4gMDsKLX0KLQotI2lmIDAKLXN0YXRpYyB2b2lkIGRzdF9kdW1wX2JpbyhzdHJ1Y3QgYmlvICpiaW8pCi17Ci0JdTggKnA7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2OwotCWludCBpOwotCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaSkgewotCQlkcHJpbnRrKCIlczogJWxsdS8ldTogc2l6ZTogJXUsIG9mZnNldDogJXUsIGRhdGE6ICIsCi0JCQkJX19mdW5jX18sIGJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUsCi0JCQkJYnYtPmJ2X2xlbiwgYnYtPmJ2X29mZnNldCk7Ci0KLQkJcCA9IGttYXAoYnYtPmJ2X3BhZ2UpICsgYnYtPmJ2X29mZnNldDsKLQkJZm9yIChpID0gMDsgaSA8IGJ2LT5idl9sZW47ICsraSkKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsIHBbaV0pOwotCQlrdW5tYXAoYnYtPmJ2X3BhZ2UpOwotCQlwcmludGsoIlxuIik7Ci0JfQotfQotI2VuZGlmCi0KLS8qCi0gKiBFbmNyeXB0L2hhc2ggZGF0YSBhbmQgc2VuZCBpdCB0byB0aGUgbmV0d29yay4KLSAqLwotc3RhdGljIGludCBkc3RfY3J5cHRvX3Byb2Nlc3Nfc2VuZGluZyhzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsCi0JCXN0cnVjdCBiaW8gKmJpbywgdTggKmhhc2gpCi17Ci0JaW50IGVycjsKLQotCWlmIChlLT5jaXBoZXIpIHsKLQkJZXJyID0gZHN0X2NyeXB0KGUsIGJpbyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXRfZXhpdDsKLQl9Ci0KLQlpZiAoZS0+aGFzaCkgewotCQllcnIgPSBkc3RfaGFzaChlLCBiaW8sIGhhc2gpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0KLSNpZmRlZiBDT05GSUdfRFNUX0RFQlVHCi0JCXsKLQkJCXVuc2lnbmVkIGludCBpOwotCi0JCQkvKiBkc3RfZHVtcF9iaW8oYmlvKTsgKi8KLQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiaW86ICVsbHUvJXUsIHJ3OiAlbHUsIGhhc2g6ICIsCi0JCQkJX19mdW5jX18sICh1NjQpYmlvLT5iaV9zZWN0b3IsCi0JCQkJYmlvLT5iaV9zaXplLCBiaW9fZGF0YV9kaXIoYmlvKSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShlLT5oYXNoKTsgKytpKQotCQkJCQlwcmludGsoIiUwMnggIiwgaGFzaFtpXSk7Ci0JCQlwcmludGsoIlxuIik7Ci0JCX0KLSNlbmRpZgotCX0KLQotCXJldHVybiAwOwotCi1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIENoZWNrIGlmIHJlY2VpdmVkIGRhdGEgaXMgdmFsaWQuIERlY2lwaGVyIGlmIGl0IGlzLgotICovCi1zdGF0aWMgaW50IGRzdF9jcnlwdG9fcHJvY2Vzc19yZWNlaXZpbmcoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLAotCQlzdHJ1Y3QgYmlvICpiaW8sIHU4ICpoYXNoLCB1OCAqcmVjdl9oYXNoKQotewotCWludCBlcnI7Ci0KLQlpZiAoZS0+aGFzaCkgewotCQlpbnQgbWlzbWF0Y2g7Ci0KLQkJZXJyID0gZHN0X2hhc2goZSwgYmlvLCBoYXNoKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dF9leGl0OwotCi0JCW1pc21hdGNoID0gISFtZW1jbXAocmVjdl9oYXNoLCBoYXNoLAotCQkJCWNyeXB0b19oYXNoX2RpZ2VzdHNpemUoZS0+aGFzaCkpOwotI2lmZGVmIENPTkZJR19EU1RfREVCVUcKLQkJLyogZHN0X2R1bXBfYmlvKGJpbyk7ICovCi0KLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiaW86ICVsbHUvJXUsIHJ3OiAlbHUsIGhhc2ggbWlzbWF0Y2g6ICVkIiwKLQkJCV9fZnVuY19fLCAodTY0KWJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUsCi0JCQliaW9fZGF0YV9kaXIoYmlvKSwgbWlzbWF0Y2gpOwotCQlpZiAobWlzbWF0Y2gpIHsKLQkJCXVuc2lnbmVkIGludCBpOwotCi0JCQlwcmludGsoIiwgcmVjdi9jYWxjOiAiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBjcnlwdG9faGFzaF9kaWdlc3RzaXplKGUtPmhhc2gpOyArK2kpCi0JCQkJcHJpbnRrKCIlMDJ4LyUwMnggIiwgcmVjdl9oYXNoW2ldLCBoYXNoW2ldKTsKLQotCQl9Ci0JCXByaW50aygiXG4iKTsKLSNlbmRpZgotCQllcnIgPSAtMTsKLQkJaWYgKG1pc21hdGNoKQotCQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0JfQotCi0JaWYgKGUtPmNpcGhlcikgewotCQllcnIgPSBkc3RfY3J5cHQoZSwgYmlvKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dF9leGl0OwotCX0KLQotCXJldHVybiAwOwotCi1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIFRocmVhZCBwb29sIGNhbGxiYWNrIHRvIGVuY3J5cHQgZGF0YSBhbmQgc2VuZCBpdCB0byB0aGUgbmV0b3dvcmsuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X3RyYW5zX2NyeXB0b19hY3Rpb24odm9pZCAqY3J5cHRvX2VuZ2luZSwgdm9pZCAqc2NoZWR1bGVfZGF0YSkKLXsKLQlzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUgPSBjcnlwdG9fZW5naW5lOwotCXN0cnVjdCBkc3RfdHJhbnMgKnQgPSBzY2hlZHVsZV9kYXRhOwotCXN0cnVjdCBiaW8gKmJpbyA9IHQtPmJpbzsKLQlpbnQgZXJyOwotCi0JZHByaW50aygiJXM6IHQ6ICVwLCBnZW46ICVsbHUsIGNpcGhlcjogJXAsIGhhc2g6ICVwLlxuIiwKLQkJCV9fZnVuY19fLCB0LCB0LT5nZW4sIGUtPmNpcGhlciwgZS0+aGFzaCk7Ci0KLQllLT5lbmMgPSB0LT5lbmM7Ci0JZS0+aXYgPSBkc3RfZ2VuX2l2KHQpOwotCi0JaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFKSB7Ci0JCWVyciA9IGRzdF9jcnlwdG9fcHJvY2Vzc19zZW5kaW5nKGUsIGJpbywgdC0+Y21kLmhhc2gpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0KLQkJaWYgKGUtPmhhc2gpIHsKLQkJCXQtPmNtZC5jc2l6ZSA9IGNyeXB0b19oYXNoX2RpZ2VzdHNpemUoZS0+aGFzaCk7Ci0JCQl0LT5jbWQuc2l6ZSArPSB0LT5jbWQuY3NpemU7Ci0JCX0KLQotCQlyZXR1cm4gZHN0X3RyYW5zX3NlbmQodCk7Ci0JfSBlbHNlIHsKLQkJdTggKmhhc2ggPSBlLT5kYXRhICsgZS0+c2l6ZS8yOwotCi0JCWVyciA9IGRzdF9jcnlwdG9fcHJvY2Vzc19yZWNlaXZpbmcoZSwgYmlvLCBoYXNoLCB0LT5jbWQuaGFzaCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCQlkc3RfdHJhbnNfcmVtb3ZlKHQpOwotCQlkc3RfdHJhbnNfcHV0KHQpOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJfb3V0X2V4aXQ6Ci0JdC0+ZXJyb3IgPSBlcnI7Ci0JZHN0X3RyYW5zX3B1dCh0KTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogU2NoZWR1bGUgY3J5cHRvIHByb2Nlc3NpbmcgZm9yIGdpdmVuIHRyYW5zYWN0aW9uLgotICovCi1pbnQgZHN0X3RyYW5zX2NyeXB0byhzdHJ1Y3QgZHN0X3RyYW5zICp0KQotewotCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IHQtPm47Ci0JaW50IGVycjsKLQotCWVyciA9IHRocmVhZF9wb29sX3NjaGVkdWxlKG4tPnBvb2wsCi0JCWRzdF90cmFuc19jcnlwdG9fc2V0dXAsIGRzdF90cmFuc19jcnlwdG9fYWN0aW9uLAotCQl0LCBNQVhfU0NIRURVTEVfVElNRU9VVCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX291dF9leGl0OgotCWRzdF90cmFuc19wdXQodCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIENyeXB0byBtYWNoaW5lcnkgZm9yIHRoZSBleHBvcnQgbm9kZS4KLSAqLwotc3RhdGljIGludCBkc3RfZXhwb3J0X2NyeXB0b19zZXR1cCh2b2lkICpjcnlwdG9fZW5naW5lLCB2b2lkICpiaW8pCi17Ci0Jc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplID0gY3J5cHRvX2VuZ2luZTsKLQotCWUtPnByaXZhdGUgPSBiaW87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHN0X2V4cG9ydF9jcnlwdG9fYWN0aW9uKHZvaWQgKmNyeXB0b19lbmdpbmUsIHZvaWQgKnNjaGVkdWxlX2RhdGEpCi17Ci0Jc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplID0gY3J5cHRvX2VuZ2luZTsKLQlzdHJ1Y3QgYmlvICpiaW8gPSBzY2hlZHVsZV9kYXRhOwotCXN0cnVjdCBkc3RfZXhwb3J0X3ByaXYgKnAgPSBiaW8tPmJpX3ByaXZhdGU7Ci0JaW50IGVycjsKLQotCWRwcmludGsoIiVzOiBlOiAlcCwgZGF0YTogJXAsIGJpbzogJWxsdS8ldSwgZGlyOiAlbHUuXG4iLAotCQkJX19mdW5jX18sIGUsIGUtPmRhdGEsICh1NjQpYmlvLT5iaV9zZWN0b3IsCi0JCQliaW8tPmJpX3NpemUsIGJpb19kYXRhX2RpcihiaW8pKTsKLQotCWUtPmVuYyA9IChiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEKTsKLQllLT5pdiA9IHAtPmNtZC5pZDsKLQotCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgewotCQl1OCAqaGFzaCA9IGUtPmRhdGEgKyBlLT5zaXplLzI7Ci0KLQkJZXJyID0gZHN0X2NyeXB0b19wcm9jZXNzX3JlY2VpdmluZyhlLCBiaW8sIGhhc2gsIHAtPmNtZC5oYXNoKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dF9leGl0OwotCi0JCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7Ci0JfSBlbHNlIHsKLQkJZXJyID0gZHN0X2NyeXB0b19wcm9jZXNzX3NlbmRpbmcoZSwgYmlvLCBwLT5jbWQuaGFzaCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCQlpZiAoZS0+aGFzaCkgewotCQkJcC0+Y21kLmNzaXplID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShlLT5oYXNoKTsKLQkJCXAtPmNtZC5zaXplICs9IHAtPmNtZC5jc2l6ZTsKLQkJfQotCi0JCWVyciA9IGRzdF9leHBvcnRfc2VuZF9iaW8oYmlvKTsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZXhpdDoKLQliaW9fcHV0KGJpbyk7Ci0JcmV0dXJuIGVycjsKLX0KLQotaW50IGRzdF9leHBvcnRfY3J5cHRvKHN0cnVjdCBkc3Rfbm9kZSAqbiwgc3RydWN0IGJpbyAqYmlvKQotewotCWludCBlcnI7Ci0KLQllcnIgPSB0aHJlYWRfcG9vbF9zY2hlZHVsZShuLT5wb29sLAotCQlkc3RfZXhwb3J0X2NyeXB0b19zZXR1cCwgZHN0X2V4cG9ydF9jcnlwdG9fYWN0aW9uLAotCQliaW8sIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCXJldHVybiAwOwotCi1lcnJfb3V0X2V4aXQ6Ci0JYmlvX3B1dChiaW8pOwotCXJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHN0L2Rjb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2Rjb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4M2NhN2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9kY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTY4ICswLDAgQEAKLS8qCi0gKiAyMDA3KyBDb3B5cmlnaHQgKGMpIEV2Z2VuaXkgUG9seWFrb3YgPHpickBpb3JlbWFwLm5ldD4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9iaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nvbm5lY3Rvci5oPgotI2luY2x1ZGUgPGxpbnV4L2RzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotCi0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLQotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0KLXN0YXRpYyBpbnQgZHN0X21ham9yOwotCi1zdGF0aWMgREVGSU5FX01VVEVYKGRzdF9oYXNoX2xvY2spOwotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmRzdF9oYXNodGFibGU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGRzdF9oYXNodGFibGVfc2l6ZSA9IDEyODsKLW1vZHVsZV9wYXJhbShkc3RfaGFzaHRhYmxlX3NpemUsIHVpbnQsIDA2NDQpOwotCi1zdGF0aWMgY2hhciBkc3RfbmFtZVtdID0gIkRlbWVudGlhbnRpbmcgZ29sZGZpc2giOwotCi1zdGF0aWMgREVGSU5FX0lEUihkc3RfaW5kZXhfaWRyKTsKLXN0YXRpYyBzdHJ1Y3QgY2JfaWQgY25fZHN0X2lkID0geyBDTl9EU1RfSURYLCBDTl9EU1RfVkFMIH07Ci0KLS8qCi0gKiBEU1Qgc3lzZnMgdHJlZSBmb3IgZGV2aWNlIGNhbGxlZCAnc3RvcmFnZSc6Ci0gKgotICogL3N5cy9idXMvZHN0L2RldmljZXMvc3RvcmFnZS8KLSAqIC9zeXMvYnVzL2RzdC9kZXZpY2VzL3N0b3JhZ2UvdHlwZSA6IDE5Mi4xNjguNC44MDoxMDI1Ci0gKiAvc3lzL2J1cy9kc3QvZGV2aWNlcy9zdG9yYWdlL3NpemUgOiA4MDAKLSAqIC9zeXMvYnVzL2RzdC9kZXZpY2VzL3N0b3JhZ2UvbmFtZSA6IHN0b3JhZ2UKLSAqLwotCi1zdGF0aWMgaW50IGRzdF9kZXZfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGJ1c190eXBlIGRzdF9kZXZfYnVzX3R5cGUgPSB7Ci0JLm5hbWUgCQk9ICJkc3QiLAotCS5tYXRjaCAJCT0gJmRzdF9kZXZfbWF0Y2gsCi19OwotCi1zdGF0aWMgdm9pZCBkc3Rfbm9kZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHN0X2luZm8gKmluZm8gPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZHN0X2luZm8sIGRldmljZSk7Ci0KLQlrZnJlZShpbmZvKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2UgZHN0X25vZGVfZGV2ID0gewotCS5idXMgCQk9ICZkc3RfZGV2X2J1c190eXBlLAotCS5yZWxlYXNlIAk9ICZkc3Rfbm9kZV9yZWxlYXNlCi19OwotCi0vKgotICogU2V0dGluZyBzaXplIG9mIHRoZSBub2RlIGFmdGVyIGl0IHdhcyBjaGFuZ2VkLgotICovCi1zdGF0aWMgdm9pZCBkc3Rfbm9kZV9zZXRfc2l6ZShzdHJ1Y3QgZHN0X25vZGUgKm4pCi17Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKLQotCXNldF9jYXBhY2l0eShuLT5kaXNrLCBuLT5zaXplID4+IDkpOwotCi0JYmRldiA9IGJkZ2V0X2Rpc2sobi0+ZGlzaywgMCk7Ci0JaWYgKGJkZXYpIHsKLQkJbXV0ZXhfbG9jaygmYmRldi0+YmRfaW5vZGUtPmlfbXV0ZXgpOwotCQlpX3NpemVfd3JpdGUoYmRldi0+YmRfaW5vZGUsIG4tPnNpemUpOwotCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2lub2RlLT5pX211dGV4KTsKLQkJYmRwdXQoYmRldik7Ci0JfQotfQotCi0vKgotICogRGlzdHJpYnV0ZWQgc3RvcmFnZSByZXF1ZXN0IHByb2Nlc3NpbmcgZnVuY3Rpb24uCi0gKi8KLXN0YXRpYyBpbnQgZHN0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKLXsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSBxLT5xdWV1ZWRhdGE7Ci0JaW50IGVyciA9IC1FSU87Ci0KLQlpZiAoYmlvX2VtcHR5X2JhcnJpZXIoYmlvKSAmJiAhYmxrX3F1ZXVlX2Rpc2NhcmQocSkpIHsKLQkJLyoKLQkJICogVGhpcyBpcyBhIGRpcnR5XlduaWNlIGhhY2ssIGJ1dCBpZiB3ZSBjb21wbGV0ZSB0aGlzCi0JCSAqIG9wZXJhdGlvbiB3aXRoIC1FT1BOT1RTVVBQIGxpa2UgaW50ZW5kZWQsIFhGUwotCQkgKiB3aWxsIHN0dWNrIGFuZCBmcmVlemUgdGhlIG1hY2hpbmUuIFRoaXMgbWF5IGJlCi0JCSAqIG5vdCBwYXJ0aWN1bGFyeSBYRlMgcHJvYmxlbSB0aG91Z2gsIGJ1dCBpdCBpcyB0aGUKLQkJICogb25seSBGUyB3aGljaCBzZW5kcyBlbXB0eSBiYXJyaWVyIGF0IHVtb3VudCB0aW1lCi0JCSAqIEkgd29ya2VkIHdpdGguCi0JCSAqCi0JCSAqIEVtcHR5IGJhcnJpZXJzIGFyZSBub3QgYWxsb3dlZCBhbnl3YXksIHNlZSA1MWZkNzdiZDlmNTEyCi0JCSAqIGZvciBleGFtcGxlLCBhbHRob3VnaCBsYXRlciBpdCB3YXMgY2hhbmdlZCB0bwotCQkgKiBiaW9fcndfZmxhZ2dlZChiaW8sIEJJT19SV19ESVNDQVJEKSBvbmx5LCB3aGljaCBkb2VzIG5vdAotCQkgKiB3b3JrIGluIHRoaXMgY2FzZS4KLQkJICovCi0JCS8qIGVyciA9IC1FT1BOT1RTVVBQOyAqLwotCQllcnIgPSAwOwotCQlnb3RvIGVuZF9pbzsKLQl9Ci0KLQliaW9fZ2V0KGJpbyk7Ci0KLQlyZXR1cm4gZHN0X3Byb2Nlc3NfYmlvKG4sIGJpbyk7Ci0KLWVuZF9pbzoKLQliaW9fZW5kaW8oYmlvLCBlcnIpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBPcGVuL2Nsb3NlIGNhbGxiYWNrcyBmb3IgYXBwcm9wcmlhdGUgYmxvY2sgZGV2aWNlLgotICovCi1zdGF0aWMgaW50IGRzdF9iZGV2X29wZW4oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlKQotewotCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKLQotCWRzdF9ub2RlX2dldChuKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkc3RfYmRldl9yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBmbW9kZV90IG1vZGUpCi17Ci0Jc3RydWN0IGRzdF9ub2RlICpuID0gZGlzay0+cHJpdmF0ZV9kYXRhOwotCi0JZHN0X25vZGVfcHV0KG4pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGRzdF9ibGtfb3BzID0gewotCS5vcGVuCQk9IGRzdF9iZGV2X29wZW4sCi0JLnJlbGVhc2UJPSBkc3RfYmRldl9yZWxlYXNlLAotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLX07Ci0KLS8qCi0gKiBCbG9jayBsYXllciBiaW5kaW5nIC0gZGlzayBpcyBjcmVhdGVkIHdoZW4gYXJyYXkgaXMgZnVsbHkgY29uZmlndXJlZAotICogYnkgdXNlcnNwYWNlIHJlcXVlc3QuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X25vZGVfY3JlYXRlX2Rpc2soc3RydWN0IGRzdF9ub2RlICpuKQotewotCWludCBlcnIgPSAtRU5PTUVNOwotCXUzMiBpbmRleCA9IDA7Ci0KLQluLT5xdWV1ZSA9IGJsa19pbml0X3F1ZXVlKE5VTEwsIE5VTEwpOwotCWlmICghbi0+cXVldWUpCi0JCWdvdG8gZXJyX291dF9leGl0OwotCi0Jbi0+cXVldWUtPnF1ZXVlZGF0YSA9IG47Ci0JYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChuLT5xdWV1ZSwgZHN0X3JlcXVlc3QpOwotCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhuLT5xdWV1ZSwgbi0+bWF4X3BhZ2VzKTsKLQlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKG4tPnF1ZXVlLCBuLT5tYXhfcGFnZXMpOwotCi0JZXJyID0gLUVOT01FTTsKLQluLT5kaXNrID0gYWxsb2NfZGlzaygxKTsKLQlpZiAoIW4tPmRpc2spCi0JCWdvdG8gZXJyX291dF9mcmVlX3F1ZXVlOwotCi0JaWYgKCEobi0+c3RhdGUtPnBlcm1pc3Npb25zICYgRFNUX1BFUk1fV1JJVEUpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkRTVCBub2RlICVzIGF0dGFjaGVkIHJlYWQtb25seS5cbiIsIG4tPm5hbWUpOwotCQlzZXRfZGlza19ybyhuLT5kaXNrLCAxKTsKLQl9Ci0KLQlpZiAoIWlkcl9wcmVfZ2V0KCZkc3RfaW5kZXhfaWRyLCBHRlBfS0VSTkVMKSkKLQkJZ290byBlcnJfb3V0X3B1dDsKLQotCW11dGV4X2xvY2soJmRzdF9oYXNoX2xvY2spOwotCWVyciA9IGlkcl9nZXRfbmV3KCZkc3RfaW5kZXhfaWRyLCBOVUxMLCAmaW5kZXgpOwotCW11dGV4X3VubG9jaygmZHN0X2hhc2hfbG9jayk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X3B1dDsKLQotCW4tPmRpc2stPm1ham9yID0gZHN0X21ham9yOwotCW4tPmRpc2stPmZpcnN0X21pbm9yID0gaW5kZXg7Ci0Jbi0+ZGlzay0+Zm9wcyA9ICZkc3RfYmxrX29wczsKLQluLT5kaXNrLT5xdWV1ZSA9IG4tPnF1ZXVlOwotCW4tPmRpc2stPnByaXZhdGVfZGF0YSA9IG47Ci0Jc25wcmludGYobi0+ZGlzay0+ZGlza19uYW1lLCBzaXplb2Yobi0+ZGlzay0+ZGlza19uYW1lKSwKLQkJCSJkc3QtJXMiLCBuLT5uYW1lKTsKLQotCXJldHVybiAwOwotCi1lcnJfb3V0X3B1dDoKLQlwdXRfZGlzayhuLT5kaXNrKTsKLWVycl9vdXRfZnJlZV9xdWV1ZToKLQlibGtfY2xlYW51cF9xdWV1ZShuLT5xdWV1ZSk7Ci1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIFN5c2ZzIG1hY2hpbmVyeTogc2hvdyBkZXZpY2UncyBzaXplLgotICovCi1zdGF0aWMgc3NpemVfdCBkc3Rfc2hvd19zaXplKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZHN0X2luZm8gKmluZm8gPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZHN0X2luZm8sIGRldmljZSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCBpbmZvLT5zaXplKTsKLX0KLQotLyoKLSAqIFNob3cgbG9jYWwgZXhwb3J0ZWQgZGV2aWNlLgotICovCi1zdGF0aWMgc3NpemVfdCBkc3Rfc2hvd19sb2NhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGRzdF9pbmZvICppbmZvID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGRzdF9pbmZvLCBkZXZpY2UpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGluZm8tPmxvY2FsKTsKLX0KLQotLyoKLSAqIFNob3dzIHR5cGUgb2YgdGhlIHJlbW90ZSBub2RlIC0gZGV2aWNlIG1ham9yL21pbm9yIG51bWJlcgotICogZm9yIGxvY2FsIG5vZGVzIGFuZCBhZGRyZXNzIChhZl9pbmV0IGlwdjQvaXB2NiBvbmx5KSBmb3IgcmVtb3RlIG5vZGVzLgotICovCi1zdGF0aWMgc3NpemVfdCBkc3Rfc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZHN0X2luZm8gKmluZm8gPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZHN0X2luZm8sIGRldmljZSk7Ci0JaW50IGZhbWlseSA9IGluZm8tPm5ldC5hZGRyLnNhX2ZhbWlseTsKLQotCWlmIChmYW1pbHkgPT0gQUZfSU5FVCkgewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaW5mby0+bmV0LmFkZHI7Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1LiV1LiV1LiV1OiVkXG4iLAotCQkJTklQUVVBRChzaW4tPnNpbl9hZGRyLnNfYWRkciksIG50b2hzKHNpbi0+c2luX3BvcnQpKTsKLQl9IGVsc2UgaWYgKGZhbWlseSA9PSBBRl9JTkVUNikgewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKQotCQkJCSZpbmZvLT5uZXQuYWRkcjsKLQkJcmV0dXJuIHNwcmludGYoYnVmLAotCQkJIiVwaTY6JWRcbiIsCi0JCQkmc2luLT5zaW42X2FkZHIsIG50b2hzKHNpbi0+c2luNl9wb3J0KSk7Ci0JfSBlbHNlIHsKLQkJaW50IGksIHN6ID0gUEFHRV9TSVpFIC0gMjsgLyogMCBzeW1ib2wgYW5kICdcbicgYmVsb3cgKi8KLQkJaW50IHNpemUsIGFkZHJsZW4gPSBpbmZvLT5uZXQuYWRkci5zYV9kYXRhX2xlbjsKLQkJdW5zaWduZWQgY2hhciAqYSA9ICh1bnNpZ25lZCBjaGFyICopJmluZm8tPm5ldC5hZGRyLnNhX2RhdGE7Ci0JCWNoYXIgKmJ1Zl9vcmlnID0gYnVmOwotCi0JCXNpemUgPSBzbnByaW50ZihidWYsIHN6LCAiZmFtaWx5OiAlZCwgYWRkcmxlbjogJXUsIGFkZHI6ICIsCi0JCQkJZmFtaWx5LCBhZGRybGVuKTsKLQkJc3ogLT0gc2l6ZTsKLQkJYnVmICs9IHNpemU7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGFkZHJsZW47ICsraSkgewotCQkJaWYgKHN6IDwgMykKLQkJCQlicmVhazsKLQotCQkJc2l6ZSA9IHNucHJpbnRmKGJ1Ziwgc3osICIlMDJ4ICIsIGFbaV0pOwotCQkJc3ogLT0gc2l6ZTsKLQkJCWJ1ZiArPSBzaXplOwotCQl9Ci0JCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIlxuIik7Ci0KLQkJcmV0dXJuIGJ1ZiAtIGJ1Zl9vcmlnOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRzdF9ub2RlX2F0dHJzW10gPSB7Ci0JX19BVFRSKHNpemUsIDA0NDQsIGRzdF9zaG93X3NpemUsIE5VTEwpLAotCV9fQVRUUih0eXBlLCAwNDQ0LCBkc3Rfc2hvd190eXBlLCBOVUxMKSwKLQlfX0FUVFIobG9jYWwsIDA0NDQsIGRzdF9zaG93X2xvY2FsLCBOVUxMKSwKLX07Ci0KLXN0YXRpYyBpbnQgZHN0X2NyZWF0ZV9ub2RlX2F0dHJpYnV0ZXMoc3RydWN0IGRzdF9ub2RlICpuKQotewotCWludCBlcnIsIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc3Rfbm9kZV9hdHRycyk7ICsraSkgewotCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm4tPmluZm8tPmRldmljZSwKLQkJCQkmZHN0X25vZGVfYXR0cnNbaV0pOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0X3JlbW92ZV9hbGw7Ci0JfQotCXJldHVybiAwOwotCi1lcnJfb3V0X3JlbW92ZV9hbGw6Ci0Jd2hpbGUgKC0taSA+PSAwKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm4tPmluZm8tPmRldmljZSwKLQkJCQkmZHN0X25vZGVfYXR0cnNbaV0pOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgZHN0X3JlbW92ZV9ub2RlX2F0dHJpYnV0ZXMoc3RydWN0IGRzdF9ub2RlICpuKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHN0X25vZGVfYXR0cnMpOyArK2kpCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmbi0+aW5mby0+ZGV2aWNlLAotCQkJCSZkc3Rfbm9kZV9hdHRyc1tpXSk7Ci19Ci0KLS8qCi0gKiBTeXNmcyBjbGVhbnVwIGFuZCBpbml0aWFsaXphdGlvbi4KLSAqIFNob3dzIG51bWJlciBvZiB1c2VmdWwgcGFyYW1ldGVycy4KLSAqLwotc3RhdGljIHZvaWQgZHN0X25vZGVfc3lzZnNfZXhpdChzdHJ1Y3QgZHN0X25vZGUgKm4pCi17Ci0JaWYgKG4tPmluZm8pIHsKLQkJZHN0X3JlbW92ZV9ub2RlX2F0dHJpYnV0ZXMobik7Ci0JCWRldmljZV91bnJlZ2lzdGVyKCZuLT5pbmZvLT5kZXZpY2UpOwotCQluLT5pbmZvID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZHN0X25vZGVfc3lzZnNfaW5pdChzdHJ1Y3QgZHN0X25vZGUgKm4pCi17Ci0JaW50IGVycjsKLQotCW4tPmluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHN0X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW4tPmluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVtY3B5KCZuLT5pbmZvLT5kZXZpY2UsICZkc3Rfbm9kZV9kZXYsIHNpemVvZihzdHJ1Y3QgZGV2aWNlKSk7Ci0Jbi0+aW5mby0+c2l6ZSA9IG4tPnNpemU7Ci0KLQlkZXZfc2V0X25hbWUoJm4tPmluZm8tPmRldmljZSwgImRzdC0lcyIsIG4tPm5hbWUpOwotCWVyciA9IGRldmljZV9yZWdpc3Rlcigmbi0+aW5mby0+ZGV2aWNlKTsKLQlpZiAoZXJyKSB7Ci0JCWRwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBub2RlICclcycsIGVycjogJWQuXG4iLAotCQkJCW4tPm5hbWUsIGVycik7Ci0JCWdvdG8gZXJyX291dF9leGl0OwotCX0KLQotCWRzdF9jcmVhdGVfbm9kZV9hdHRyaWJ1dGVzKG4pOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZXhpdDoKLQlrZnJlZShuLT5pbmZvKTsKLQluLT5pbmZvID0gTlVMTDsKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogRFNUIG5vZGUgaGFzaCB0YWJsZXMgbWFjaGluZXJ5LgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkc3RfaGFzaChjaGFyICpzdHIsIHVuc2lnbmVkIGludCBzaXplKQotewotCXJldHVybiBqaGFzaChzdHIsIHNpemUsIDApICUgZHN0X2hhc2h0YWJsZV9zaXplOwotfQotCi1zdGF0aWMgdm9pZCBkc3Rfbm9kZV9yZW1vdmUoc3RydWN0IGRzdF9ub2RlICpuKQotewotCW11dGV4X2xvY2soJmRzdF9oYXNoX2xvY2spOwotCWxpc3RfZGVsX2luaXQoJm4tPm5vZGVfZW50cnkpOwotCW11dGV4X3VubG9jaygmZHN0X2hhc2hfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRzdF9ub2RlX2FkZChzdHJ1Y3QgZHN0X25vZGUgKm4pCi17Ci0JdW5zaWduZWQgaGFzaCA9IGRzdF9oYXNoKG4tPm5hbWUsIHNpemVvZihuLT5uYW1lKSk7Ci0KLQltdXRleF9sb2NrKCZkc3RfaGFzaF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZuLT5ub2RlX2VudHJ5LCAmZHN0X2hhc2h0YWJsZVtoYXNoXSk7Ci0JbXV0ZXhfdW5sb2NrKCZkc3RfaGFzaF9sb2NrKTsKLX0KLQotLyoKLSAqIENsZWFuaW5nIG5vZGUgd2hlbiBpdCBpcyBhYm91dCB0byBiZSBmcmVlZC4KLSAqIFRoZXJlIGFyZSBzdGlsbCB1c2VycyBvZiB0aGUgc29ja2V0IHRob3VnaCwKLSAqIHNvIGNvbm5lY3Rpb24gY2xlYW51cCBzaG91bGQgYmUgcHJvdGVjdGVkLgotICovCi1zdGF0aWMgdm9pZCBkc3Rfbm9kZV9jbGVhbnVwKHN0cnVjdCBkc3Rfbm9kZSAqbikKLXsKLQlzdHJ1Y3QgZHN0X3N0YXRlICpzdCA9IG4tPnN0YXRlOwotCi0JaWYgKCFzdCkKLQkJcmV0dXJuOwotCi0JaWYgKG4tPnF1ZXVlKSB7Ci0JCWJsa19jbGVhbnVwX3F1ZXVlKG4tPnF1ZXVlKTsKLQotCQltdXRleF9sb2NrKCZkc3RfaGFzaF9sb2NrKTsKLQkJaWRyX3JlbW92ZSgmZHN0X2luZGV4X2lkciwgbi0+ZGlzay0+Zmlyc3RfbWlub3IpOwotCQltdXRleF91bmxvY2soJmRzdF9oYXNoX2xvY2spOwotCi0JCXB1dF9kaXNrKG4tPmRpc2spOwotCX0KLQotCWlmIChuLT5iZGV2KSB7Ci0JCXN5bmNfYmxvY2tkZXYobi0+YmRldik7Ci0JCWNsb3NlX2JkZXZfZXhjbHVzaXZlKG4tPmJkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOwotCX0KLQotCWRzdF9zdGF0ZV9sb2NrKHN0KTsKLQlzdC0+bmVlZF9leGl0ID0gMTsKLQlkc3Rfc3RhdGVfZXhpdF9jb25uZWN0ZWQoc3QpOwotCWRzdF9zdGF0ZV91bmxvY2soc3QpOwotCi0Jd2FrZV91cCgmc3QtPnRocmVhZF93YWl0KTsKLQotCWRzdF9zdGF0ZV9wdXQoc3QpOwotCW4tPnN0YXRlID0gTlVMTDsKLX0KLQotLyoKLSAqIEZyZWUgc2VjdXJpdHkgYXR0cmlidXRlcyBhdHRhY2hlZCB0byBnaXZlbiBub2RlLgotICovCi1zdGF0aWMgdm9pZCBkc3Rfc2VjdXJpdHlfZXhpdChzdHJ1Y3QgZHN0X25vZGUgKm4pCi17Ci0Jc3RydWN0IGRzdF9zZWN1cmUgKnMsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocywgdG1wLCAmbi0+c2VjdXJpdHlfbGlzdCwgc2VjX2VudHJ5KSB7Ci0JCWxpc3RfZGVsKCZzLT5zZWNfZW50cnkpOwotCQlrZnJlZShzKTsKLQl9Ci19Ci0KLS8qCi0gKiBGcmVlIG5vZGUgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB1c2Vycy4KLSAqIEFjdHVhbGx5IG5vZGUgaGFzIHRvIGJlIGZyZWVkIG9uIGJlaGFsZiBvZCB1c2Vyc3BhY2UgcHJvY2VzcywKLSAqIHNpbmNlIHRoZXJlIGFyZSBudW1iZXIgb2YgdGhyZWFkcywgd2hpY2ggYXJlIGVtYmVkZGVkIGluIHRoZQotICogbm9kZSwgc28gdGhleSBjYW4gbm90IGV4aXQgYW5kIGZyZWUgbm9kZSBmcm9tIHRoZXJlLCB0aGF0IGlzCi0gKiB3aHkgdGhlcmUgaXMgYSB3YWtldXAgaWYgcmVmZXJlbmNlIGNvdW50ZXIgaXMgbm90IGVxdWFsIHRvIHplcm8uCi0gKi8KLXZvaWQgZHN0X25vZGVfcHV0KHN0cnVjdCBkc3Rfbm9kZSAqbikKLXsKLQlpZiAodW5saWtlbHkoIW4pKQotCQlyZXR1cm47Ci0KLQlkcHJpbnRrKCIlczogbjogJXAsIHJlZmNudDogJWQuXG4iLAotCQkJX19mdW5jX18sIG4sIGF0b21pY19yZWFkKCZuLT5yZWZjbnQpKTsKLQotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZuLT5yZWZjbnQpKSB7Ci0JCWRzdF9ub2RlX3JlbW92ZShuKTsKLQkJbi0+dHJhbnNfc2Nhbl90aW1lb3V0ID0gMDsKLQkJZHN0X25vZGVfY2xlYW51cChuKTsKLQkJdGhyZWFkX3Bvb2xfZGVzdHJveShuLT5wb29sKTsKLQkJZHN0X25vZGVfc3lzZnNfZXhpdChuKTsKLQkJZHN0X25vZGVfY3J5cHRvX2V4aXQobik7Ci0JCWRzdF9zZWN1cml0eV9leGl0KG4pOwotCQlkc3Rfbm9kZV90cmFuc19leGl0KG4pOwotCi0JCWtmcmVlKG4pOwotCi0JCWRwcmludGsoIiVzOiBmcmVlZCBuOiAlcC5cbiIsIF9fZnVuY19fLCBuKTsKLQl9IGVsc2UgewotCQl3YWtlX3VwKCZuLT53YWl0KTsKLQl9Ci19Ci0KLS8qCi0gKiBTZXR0aW5nIHVwIGV4cG9ydCBkZXZpY2U6IGxvb2t1cCBieSB0aGUgbmFtZSwgZ2V0IGl0cyBzaXplCi0gKiBhbmQgc2V0dXAgbGlzdGVuaW5nIHNvY2tldCwgd2hpY2ggd2lsbCBhY2NlcHQgY2xpZW50cywgd2hpY2gKLSAqIHdpbGwgc3VibWl0IElPIGZvciBnaXZlbiBzdG9yYWdlLgotICovCi1zdGF0aWMgaW50IGRzdF9zZXR1cF9leHBvcnQoc3RydWN0IGRzdF9ub2RlICpuLCBzdHJ1Y3QgZHN0X2N0bCAqY3RsLAotCQlzdHJ1Y3QgZHN0X2V4cG9ydF9jdGwgKmxlKQotewotCWludCBlcnI7Ci0KLQlzbnByaW50ZihuLT5pbmZvLT5sb2NhbCwgc2l6ZW9mKG4tPmluZm8tPmxvY2FsKSwgIiVzIiwgbGUtPmRldmljZSk7Ci0KLQluLT5iZGV2ID0gb3Blbl9iZGV2X2V4Y2x1c2l2ZShsZS0+ZGV2aWNlLCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFLCBOVUxMKTsKLQlpZiAoSVNfRVJSKG4tPmJkZXYpKQotCQlyZXR1cm4gUFRSX0VSUihuLT5iZGV2KTsKLQotCWlmIChuLT5zaXplICE9IDApCi0JCW4tPnNpemUgPSBtaW5fdChsb2ZmX3QsIG4tPmJkZXYtPmJkX2lub2RlLT5pX3NpemUsIG4tPnNpemUpOwotCWVsc2UKLQkJbi0+c2l6ZSA9IG4tPmJkZXYtPmJkX2lub2RlLT5pX3NpemU7Ci0KLQluLT5pbmZvLT5zaXplID0gbi0+c2l6ZTsKLQllcnIgPSBkc3Rfbm9kZV9pbml0X2xpc3RlbmVkKG4sIGxlKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfY2xlYW51cDsKLQotCXJldHVybiAwOwotCi1lcnJfb3V0X2NsZWFudXA6Ci0JY2xvc2VfYmRldl9leGNsdXNpdmUobi0+YmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7Ci0Jbi0+YmRldiA9IE5VTEw7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKiBFbXB0eSB0aHJlYWQgcG9vbCBjYWxsYmFja3MgZm9yIHRoZSBuZXR3b3JrIHByb2Nlc3NpbmcgdGhyZWFkcy4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqZHN0X3RocmVhZF9uZXR3b3JrX2luaXQodm9pZCAqZGF0YSkKLXsKLQlkcHJpbnRrKCIlczogZGF0YTogJXAuXG4iLCBfX2Z1bmNfXywgZGF0YSk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkc3RfdGhyZWFkX25ldHdvcmtfY2xlYW51cCh2b2lkICpkYXRhKQotewotCWRwcmludGsoIiVzOiBkYXRhOiAlcC5cbiIsIF9fZnVuY19fLCBkYXRhKTsKLX0KLQotLyoKLSAqIEFsbG9jYXRlIERTVCBub2RlIGFuZCBpbml0aWFsaXplIHNvbWUgb2YgaXRzIHBhcmFtZXRlcnMuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZHN0X25vZGUgKmRzdF9hbGxvY19ub2RlKHN0cnVjdCBkc3RfY3RsICpjdGwsCi0JCWludCAoKnN0YXJ0KShzdHJ1Y3QgZHN0X25vZGUgKiksCi0JCWludCBudW0pCi17Ci0Jc3RydWN0IGRzdF9ub2RlICpuOwotCWludCBlcnI7Ci0KLQluID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzdF9ub2RlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuKQotCQlyZXR1cm4gTlVMTDsKLQotCUlOSVRfTElTVF9IRUFEKCZuLT5ub2RlX2VudHJ5KTsKLQotCUlOSVRfTElTVF9IRUFEKCZuLT5zZWN1cml0eV9saXN0KTsKLQltdXRleF9pbml0KCZuLT5zZWN1cml0eV9sb2NrKTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm4tPndhaXQpOwotCi0Jbi0+dHJhbnNfc2Nhbl90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhjdGwtPnRyYW5zX3NjYW5fdGltZW91dCk7Ci0JaWYgKCFuLT50cmFuc19zY2FuX3RpbWVvdXQpCi0JCW4tPnRyYW5zX3NjYW5fdGltZW91dCA9IEhaOwotCi0Jbi0+dHJhbnNfbWF4X3JldHJpZXMgPSBjdGwtPnRyYW5zX21heF9yZXRyaWVzOwotCWlmICghbi0+dHJhbnNfbWF4X3JldHJpZXMpCi0JCW4tPnRyYW5zX21heF9yZXRyaWVzID0gMTA7Ci0KLQkvKgotCSAqIFByZXR0eSBtdWNoIGFyYml0cmFyeSBkZWZhdWx0IG51bWJlcnMuCi0JICogMzIgbWF0Y2hlcyBtYXhpbXVtIG51bWJlciBvZiBwYWdlcyBpbiBiaW8gb3JpZ2luYXRlZCBmcm9tIGV4dDMgKDMxKS4KLQkgKi8KLQluLT5tYXhfcGFnZXMgPSBjdGwtPm1heF9wYWdlczsKLQlpZiAoIW4tPm1heF9wYWdlcykKLQkJbi0+bWF4X3BhZ2VzID0gMzI7Ci0KLQlpZiAobi0+bWF4X3BhZ2VzID4gMTAyNCkKLQkJbi0+bWF4X3BhZ2VzID0gMTAyNDsKLQotCW4tPnN0YXJ0ID0gc3RhcnQ7Ci0Jbi0+c2l6ZSA9IGN0bC0+c2l6ZTsKLQotCWF0b21pY19zZXQoJm4tPnJlZmNudCwgMSk7Ci0JYXRvbWljX2xvbmdfc2V0KCZuLT5nZW4sIDApOwotCXNucHJpbnRmKG4tPm5hbWUsIHNpemVvZihuLT5uYW1lKSwgIiVzIiwgY3RsLT5uYW1lKTsKLQotCWVyciA9IGRzdF9ub2RlX3N5c2ZzX2luaXQobik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0KLQluLT5wb29sID0gdGhyZWFkX3Bvb2xfY3JlYXRlKG51bSwgbi0+bmFtZSwgZHN0X3RocmVhZF9uZXR3b3JrX2luaXQsCi0JCQlkc3RfdGhyZWFkX25ldHdvcmtfY2xlYW51cCwgbik7Ci0JaWYgKElTX0VSUihuLT5wb29sKSkgewotCQllcnIgPSBQVFJfRVJSKG4tPnBvb2wpOwotCQlnb3RvIGVycl9vdXRfc3lzZnNfZXhpdDsKLQl9Ci0KLQlkcHJpbnRrKCIlczogbjogJXAsIG5hbWU6ICVzLlxuIiwgX19mdW5jX18sIG4sIG4tPm5hbWUpOwotCi0JcmV0dXJuIG47Ci0KLWVycl9vdXRfc3lzZnNfZXhpdDoKLQlkc3Rfbm9kZV9zeXNmc19leGl0KG4pOwotZXJyX291dF9mcmVlOgotCWtmcmVlKG4pOwotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogU3RhcnRpbmcgYSBub2RlLCBjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBzZXJ2ZXI6Ci0gKiByZWdpc3RlciBibG9jayBkZXZpY2UgYW5kIGluaXRpYWxpemUgdHJhbnNhY3Rpb24gbWVjaGFuaXNtLgotICogSW4gcmV2ZXJzIG9yZGVyIHRob3VnaC4KLSAqCi0gKiBJdCB3aWxsIGF1dG9uZWdvdGlhdGUgc29tZSBwYXJhbWV0ZXJzIHdpdGggdGhlIHJlbW90ZSBub2RlCi0gKiBhbmQgdXBkYXRlIGxvY2FsIGlmIG5lZWRlZC4KLSAqCi0gKiBUcmFuc2FjdGlvbiBpbml0aWFsaXphdGlvbiBzaG91bGQgYmUgdGhlIGxhc3QgdGhpbmcgYmVmb3JlCi0gKiBzdGFydGluZyB0aGUgbm9kZSwgc2luY2UgdHJhbnNhY3Rpb24gc2hvdWxkIGluY2x1ZGUgbm90IG9ubHkKLSAqIGJsb2NrIElPLCBidXQgYWxzbyBjcnlwdG8gcmVsYXRlZCBkYXRhIChpZiBhbnkpLCB3aGljaCBhcmUKLSAqIGluaXRpYWxpemVkIHNlcGFyYXRlbHkuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X3N0YXJ0X3JlbW90ZShzdHJ1Y3QgZHN0X25vZGUgKm4pCi17Ci0JaW50IGVycjsKLQotCWVyciA9IGRzdF9ub2RlX3RyYW5zX2luaXQobiwgc2l6ZW9mKHN0cnVjdCBkc3RfdHJhbnMpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gZHN0X25vZGVfY3JlYXRlX2Rpc2sobik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWRzdF9ub2RlX3NldF9zaXplKG4pOwotCWFkZF9kaXNrKG4tPmRpc2spOwotCi0JZHByaW50aygiRFNUOiBzdGFydGVkIHJlbW90ZSBub2RlICclcycsIG1pbm9yOiAlZC5cbiIsCi0JCQluLT5uYW1lLCBuLT5kaXNrLT5maXJzdF9taW5vcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEFkZGluZyByZW1vdGUgbm9kZSBhbmQgaW5pdGlhbGl6ZSBjb25uZWN0aW9uLgotICovCi1zdGF0aWMgaW50IGRzdF9hZGRfcmVtb3RlKHN0cnVjdCBkc3Rfbm9kZSAqbiwgc3RydWN0IGRzdF9jdGwgKmN0bCwKLQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgZHN0X25ldHdvcmtfY3RsICpyY3RsID0gZGF0YTsKLQotCWlmIChuKQotCQlyZXR1cm4gLUVFWElTVDsKLQotCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgZHN0X25ldHdvcmtfY3RsKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQluID0gZHN0X2FsbG9jX25vZGUoY3RsLCBkc3Rfc3RhcnRfcmVtb3RlLCAxKTsKLQlpZiAoIW4pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVtY3B5KCZuLT5pbmZvLT5uZXQsIHJjdGwsIHNpemVvZihzdHJ1Y3QgZHN0X25ldHdvcmtfY3RsKSk7Ci0JZXJyID0gZHN0X25vZGVfaW5pdF9jb25uZWN0ZWQobiwgcmN0bCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0KLQlkc3Rfbm9kZV9hZGQobik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX291dF9mcmVlOgotCWRzdF9ub2RlX3B1dChuKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogQWRkaW5nIGV4cG9ydCBub2RlOiBpbml0aWFsaXppbmcgYmxvY2sgZGV2aWNlIGFuZCBsaXN0ZW5pbmcgc29ja2V0LgotICovCi1zdGF0aWMgaW50IGRzdF9hZGRfZXhwb3J0KHN0cnVjdCBkc3Rfbm9kZSAqbiwgc3RydWN0IGRzdF9jdGwgKmN0bCwKLQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgZHN0X2V4cG9ydF9jdGwgKmxlID0gZGF0YTsKLQotCWlmIChuKQotCQlyZXR1cm4gLUVFWElTVDsKLQotCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgZHN0X2V4cG9ydF9jdGwpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW4gPSBkc3RfYWxsb2Nfbm9kZShjdGwsIGRzdF9zdGFydF9leHBvcnQsIDIpOwotCWlmICghbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllcnIgPSBkc3Rfc2V0dXBfZXhwb3J0KG4sIGN0bCwgbGUpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF9mcmVlOwotCi0JZHN0X25vZGVfYWRkKG4pOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZnJlZToKLQlkc3Rfbm9kZV9wdXQobik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBkc3Rfbm9kZV9yZW1vdmVfdW5sb2FkKHN0cnVjdCBkc3Rfbm9kZSAqbikKLXsKLQlwcmludGsoS0VSTl9JTkZPICJTVE9QUEVEIG5hbWU6ICclcycsIHNpemU6ICVsbHUuXG4iLAotCQkJbi0+bmFtZSwgbi0+c2l6ZSk7Ci0KLQlpZiAobi0+ZGlzaykKLQkJZGVsX2dlbmRpc2sobi0+ZGlzayk7Ci0KLQlkc3Rfbm9kZV9yZW1vdmUobik7Ci0JZHN0X25vZGVfc3lzZnNfZXhpdChuKTsKLQotCS8qCi0JICogVGhpcyBpcyBub3QgYSBoYWNrLiBSZWFsbHkuCi0JICogTm9kZSdzIHJlZmVyZW5jZSBjb3VudGVyIGFsbG93cyB0byBpbXBsZW1lbnQgZmluZSBncmFpbmVkCi0JICogbm9kZSBmcmVlaW5nLCBidXQgc2luY2UgYWxsIHRyYW5zYWN0aW9ucyAod2hpY2ggaG9sZCBub2RlJ3MKLQkgKiByZWZlcmVuY2UgY291bnRlcikgYXJlIHByb2Nlc3NlZCBpbiB0aGUgZGVkaWNhdGVkIHRocmVhZCwKLQkgKiBpdCBpcyBwb3NzaWJsZSB0aGF0IHJlZmVyZW5jZSB3aWxsIGhpdCB6ZXJvIGluIHRoYXQgdGhyZWFkLAotCSAqIHNvIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gZXhpdCB0aHJlYWQgYW5kIGNsZWFudXAgdGhlIG5vZGUuCi0JICoKLQkgKiBTbywgd2UgcmVtb3ZlIGRpc2ssIHNvIG5vIG5ldyBhY3Rpdml0eSBpcyBwb3NzaWJsZSwgYW5kCi0JICogd2FpdCB1bnRpbCBhbGwgcGVuZGluZyB0cmFuc2FjdGlvbiBhcmUgY29tcGxldGVkIChlaXRoZXIKLQkgKiBpbiByZWNlaXZpbmcgdGhyZWFkIG9yIGJ5IHRpbWVvdXQgaW4gd29ya3F1ZXVlKSwgaW4gdGhpcwotCSAqIGNhc2UgcmVmZXJlbmNlIGNvdW50ZXIgd2lsbCBiZSBsZXNzIG9yIGVxdWFsIHRvIDIgKG9uY2Ugc2V0IGluCi0JICogZHN0X2FsbG9jX25vZGUoKSBhbmQgdGhlbiBpbiBjb25uZWN0b3IgbWVzc2FnZSBwYXJzZXI7Ci0JICogb3Igd2hlbiB3ZSBmb3JjZSBtb2R1bGUgdW5sb2FkaW5nLCBhbmQgY29ubmVjdG9yIG1lc3NhZ2UKLQkgKiBwYXJzZXIgZG9lcyBub3QgaG9sZCBhIHJlZmVyZW5jZSwgaW4gdGhpcyBjYXNlIHJlZmVyZW5jZQotCSAqIGNvdW50ZXIgd2lsbCBiZSBlcXVhbCB0byAxKSwKLQkgKiBhbmQgc3Vic2VxdWVudCBkc3Rfbm9kZV9wdXQoKSBjYWxscyB3aWxsIGZyZWUgdGhlIG5vZGUuCi0JICovCi0JZHByaW50aygiJXM6IGdvaW5nIHRvIHNsZWVwIHdpdGggJWQgcmVmY250LlxuIiwKLQkJCV9fZnVuY19fLCBhdG9taWNfcmVhZCgmbi0+cmVmY250KSk7Ci0Jd2FpdF9ldmVudChuLT53YWl0LCBhdG9taWNfcmVhZCgmbi0+cmVmY250KSA8PSAyKTsKLQotCWRzdF9ub2RlX3B1dChuKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJlbW92ZSBub2RlIGZyb20gdGhlIGhhc2ggdGFibGUuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X2RlbF9ub2RlKHN0cnVjdCBkc3Rfbm9kZSAqbiwgc3RydWN0IGRzdF9jdGwgKmN0bCwKLQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JaWYgKCFuKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiBkc3Rfbm9kZV9yZW1vdmVfdW5sb2FkKG4pOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBjcnlwdG8gcHJvY2Vzc2luZyBmb3IgZ2l2ZW4gbm9kZS4KLSAqLwotc3RhdGljIGludCBkc3RfY3J5cHRvX2luaXQoc3RydWN0IGRzdF9ub2RlICpuLCBzdHJ1Y3QgZHN0X2N0bCAqY3RsLAotCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmNyeXB0byA9IGRhdGE7Ci0KLQlpZiAoIW4pCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBkc3RfY3J5cHRvX2N0bCkgKyBjcnlwdG8tPmhhc2hfa2V5c2l6ZSArCi0JCQljcnlwdG8tPmNpcGhlcl9rZXlzaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChuLT50cmFuc19jYWNoZSkKLQkJcmV0dXJuIC1FRVhJU1Q7Ci0KLQlyZXR1cm4gZHN0X25vZGVfY3J5cHRvX2luaXQobiwgY3J5cHRvKTsKLX0KLQotLyoKLSAqIFNlY3VyaXR5IGF0dHJpYnV0ZXMgZm9yIGdpdmVuIG5vZGUuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X3NlY3VyaXR5X2luaXQoc3RydWN0IGRzdF9ub2RlICpuLCBzdHJ1Y3QgZHN0X2N0bCAqY3RsLAotCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgZHN0X3NlY3VyZSAqczsKLQotCWlmICghbikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGRzdF9zZWN1cmVfdXNlcikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkc3Rfc2VjdXJlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbWNweSgmcy0+c2VjLCBkYXRhLCBzaXplKTsKLQotCW11dGV4X2xvY2soJm4tPnNlY3VyaXR5X2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJnMtPnNlY19lbnRyeSwgJm4tPnNlY3VyaXR5X2xpc3QpOwotCW11dGV4X3VubG9jaygmbi0+c2VjdXJpdHlfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEtpbGwnZW0gYWxsIQotICovCi1zdGF0aWMgaW50IGRzdF9zdGFydF9ub2RlKHN0cnVjdCBkc3Rfbm9kZSAqbiwgc3RydWN0IGRzdF9jdGwgKmN0bCwKLQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JaW50IGVycjsKLQotCWlmICghbikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAobi0+dHJhbnNfY2FjaGUpCi0JCXJldHVybiAwOwotCi0JZXJyID0gbi0+c3RhcnQobik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXByaW50ayhLRVJOX0lORk8gIlNUQVJURUQgbmFtZTogJyVzJywgc2l6ZTogJWxsdS5cbiIsIG4tPm5hbWUsIG4tPnNpemUpOwotCXJldHVybiAwOwotfQotCi10eXBlZGVmIGludCAoKmRzdF9jb21tYW5kX2Z1bmMpKHN0cnVjdCBkc3Rfbm9kZSAqbiwgc3RydWN0IGRzdF9jdGwgKmN0bCwKLQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpOwotCi0vKgotICogTGlzdCBvZiB1c2Vyc3BhY2UgY29tbWFuZHMuCi0gKi8KLXN0YXRpYyBkc3RfY29tbWFuZF9mdW5jIGRzdF9jb21tYW5kc1tdID0gewotCVtEU1RfQUREX1JFTU9URV0gPSAmZHN0X2FkZF9yZW1vdGUsCi0JW0RTVF9BRERfRVhQT1JUXSA9ICZkc3RfYWRkX2V4cG9ydCwKLQlbRFNUX0RFTF9OT0RFXSA9ICZkc3RfZGVsX25vZGUsCi0JW0RTVF9DUllQVE9dID0gJmRzdF9jcnlwdG9faW5pdCwKLQlbRFNUX1NFQ1VSSVRZXSA9ICZkc3Rfc2VjdXJpdHlfaW5pdCwKLQlbRFNUX1NUQVJUXSA9ICZkc3Rfc3RhcnRfbm9kZSwKLX07Ci0KLS8qCi0gKiBDb25maWd1cmF0aW9uIHBhcnNlci4KLSAqLwotc3RhdGljIHZvaWQgY25fZHN0X2NhbGxiYWNrKHN0cnVjdCBjbl9tc2cgKm1zZywgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICpuc3ApCi17Ci0Jc3RydWN0IGRzdF9jdGwgKmN0bDsKLQlpbnQgZXJyOwotCXN0cnVjdCBkc3RfY3RsX2FjayBhY2s7Ci0Jc3RydWN0IGRzdF9ub2RlICpuID0gTlVMTCwgKnRtcDsKLQl1bnNpZ25lZCBpbnQgaGFzaDsKLQotCWlmICghY2FwX3JhaXNlZChuc3AtPmVmZl9jYXAsIENBUF9TWVNfQURNSU4pKSB7Ci0JCWVyciA9IC1FUEVSTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKG1zZy0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBkc3RfY3RsKSkgewotCQllcnIgPSAtRUJBRE1TRzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JY3RsID0gKHN0cnVjdCBkc3RfY3RsICopbXNnLT5kYXRhOwotCi0JaWYgKGN0bC0+Y21kID49IERTVF9DTURfTUFYKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQloYXNoID0gZHN0X2hhc2goY3RsLT5uYW1lLCBzaXplb2YoY3RsLT5uYW1lKSk7Ci0KLQltdXRleF9sb2NrKCZkc3RfaGFzaF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmRzdF9oYXNodGFibGVbaGFzaF0sIG5vZGVfZW50cnkpIHsKLQkJaWYgKCFtZW1jbXAodG1wLT5uYW1lLCBjdGwtPm5hbWUsIHNpemVvZih0bXAtPm5hbWUpKSkgewotCQkJbiA9IHRtcDsKLQkJCWRzdF9ub2RlX2dldChuKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmZHN0X2hhc2hfbG9jayk7Ci0KLQllcnIgPSBkc3RfY29tbWFuZHNbY3RsLT5jbWRdKG4sIGN0bCwgbXNnLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBkc3RfY3RsKSwKLQkJCW1zZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBkc3RfY3RsKSk7Ci0KLQlkc3Rfbm9kZV9wdXQobik7Ci1vdXQ6Ci0JbWVtY3B5KCZhY2subXNnLCBtc2csIHNpemVvZihzdHJ1Y3QgY25fbXNnKSk7Ci0KLQlhY2subXNnLmFjayA9IG1zZy0+YWNrICsgMTsKLQlhY2subXNnLmxlbiA9IHNpemVvZihzdHJ1Y3QgZHN0X2N0bF9hY2spIC0gc2l6ZW9mKHN0cnVjdCBjbl9tc2cpOwotCi0JYWNrLmVycm9yID0gZXJyOwotCi0JY25fbmV0bGlua19zZW5kKCZhY2subXNnLCAwLCBHRlBfS0VSTkVMKTsKLX0KLQotLyoKLSAqIEdsb2JhbCBpbml0aWFsaXphdGlvbjogc3lzZnMsIGhhc2ggdGFibGUsIGJsb2NrIGRldmljZSByZWdpc3RyYXRpb24sCi0gKiBjb25uZWN0b3IgYW5kIHZhcmlvdXMgY2FjaGVzLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBkc3Rfc3lzZnNfaW5pdCh2b2lkKQotewotCXJldHVybiBidXNfcmVnaXN0ZXIoJmRzdF9kZXZfYnVzX3R5cGUpOwotfQotCi1zdGF0aWMgdm9pZCBkc3Rfc3lzZnNfZXhpdCh2b2lkKQotewotCWJ1c191bnJlZ2lzdGVyKCZkc3RfZGV2X2J1c190eXBlKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgZHN0X2hhc2h0YWJsZV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlkc3RfaGFzaHRhYmxlID0ga2NhbGxvYyhkc3RfaGFzaHRhYmxlX3NpemUsIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmICghZHN0X2hhc2h0YWJsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZHN0X2hhc2h0YWJsZV9zaXplOyArK2kpCi0JCUlOSVRfTElTVF9IRUFEKCZkc3RfaGFzaHRhYmxlW2ldKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkc3RfaGFzaHRhYmxlX2V4aXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4sICp0bXA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZHN0X2hhc2h0YWJsZV9zaXplOyArK2kpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG4sIHRtcCwgJmRzdF9oYXNodGFibGVbaV0sIG5vZGVfZW50cnkpIHsKLQkJCWRzdF9ub2RlX3JlbW92ZV91bmxvYWQobik7Ci0JCX0KLQl9Ci0KLQlrZnJlZShkc3RfaGFzaHRhYmxlKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgZHN0X3N5c19pbml0KHZvaWQpCi17Ci0JaW50IGVyciA9IC1FTk9NRU07Ci0KLQllcnIgPSBkc3RfaGFzaHRhYmxlX2luaXQoKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCWVyciA9IGRzdF9leHBvcnRfaW5pdCgpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF9oYXNodGFibGVfZXhpdDsKLQotCWVyciA9IHJlZ2lzdGVyX2Jsa2Rldihkc3RfbWFqb3IsIERTVF9OQU1FKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnJfb3V0X2V4cG9ydF9leGl0OwotCWlmIChlcnIpCi0JCWRzdF9tYWpvciA9IGVycjsKLQotCWVyciA9IGRzdF9zeXNmc19pbml0KCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXI7Ci0KLQllcnIgPSBjbl9hZGRfY2FsbGJhY2soJmNuX2RzdF9pZCwgIkRTVCIsIGNuX2RzdF9jYWxsYmFjayk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X3N5c2ZzX2V4aXQ7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJEaXN0cmlidXRlZCBzdG9yYWdlLCAnJXMnIHJlbGVhc2UuXG4iLCBkc3RfbmFtZSk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX291dF9zeXNmc19leGl0OgotCWRzdF9zeXNmc19leGl0KCk7Ci1lcnJfb3V0X3VucmVnaXN0ZXI6Ci0JdW5yZWdpc3Rlcl9ibGtkZXYoZHN0X21ham9yLCBEU1RfTkFNRSk7Ci1lcnJfb3V0X2V4cG9ydF9leGl0OgotCWRzdF9leHBvcnRfZXhpdCgpOwotZXJyX291dF9oYXNodGFibGVfZXhpdDoKLQlkc3RfaGFzaHRhYmxlX2V4aXQoKTsKLWVycl9vdXRfZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZHN0X3N5c19leGl0KHZvaWQpCi17Ci0JY25fZGVsX2NhbGxiYWNrKCZjbl9kc3RfaWQpOwotCXVucmVnaXN0ZXJfYmxrZGV2KGRzdF9tYWpvciwgRFNUX05BTUUpOwotCWRzdF9oYXNodGFibGVfZXhpdCgpOwotCWRzdF9zeXNmc19leGl0KCk7Ci0JZHN0X2V4cG9ydF9leGl0KCk7Ci19Ci0KLW1vZHVsZV9pbml0KGRzdF9zeXNfaW5pdCk7Ci1tb2R1bGVfZXhpdChkc3Rfc3lzX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkRpc3RyaWJ1dGVkIHN0b3JhZ2UiKTsKLU1PRFVMRV9BVVRIT1IoIkV2Z2VuaXkgUG9seWFrb3YgPHpickBpb3JlbWFwLm5ldD4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvZXhwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2V4cG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI0MjMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvZXhwb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotLyoKLSAqIDIwMDcrIENvcHlyaWdodCAoYykgRXZnZW5peSBQb2x5YWtvdiA8emJyQGlvcmVtYXAubmV0PgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgotI2luY2x1ZGUgPGxpbnV4L2RzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0KLS8qCi0gKiBFeHBvcnQgYmlvc2V0IGlzIHVzZWQgZm9yIHNlcnZlciBibG9jayBJTyByZXF1ZXN0cy4KLSAqLwotc3RhdGljIHN0cnVjdCBiaW9fc2V0ICpkc3RfYmlvX3NldDsKLQotaW50IF9faW5pdCBkc3RfZXhwb3J0X2luaXQodm9pZCkKLXsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCWRzdF9iaW9fc2V0ID0gYmlvc2V0X2NyZWF0ZSgzMiwgc2l6ZW9mKHN0cnVjdCBkc3RfZXhwb3J0X3ByaXYpKTsKLQlpZiAoIWRzdF9iaW9fc2V0KQotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCXJldHVybiAwOwotCi1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotdm9pZCBkc3RfZXhwb3J0X2V4aXQodm9pZCkKLXsKLQliaW9zZXRfZnJlZShkc3RfYmlvX3NldCk7Ci19Ci0KLS8qCi0gKiBXaGVuIGNsaWVudCBjb25uZWN0cyBhbmQgYXV0b25lZ290aWF0ZXMgd2l0aCB0aGUgc2VydmVyIG5vZGUsCi0gKiBpdHMgcGVybWlzc2lvbnMgYXJlIGNoZWNrZWQgaW4gYSBzZWN1cml0eSBhdHRyaWJ1dGVzIGFuZCBzZW50Ci0gKiBiYWNrLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGRzdF9jaGVja19wZXJtaXNzaW9ucyhzdHJ1Y3QgZHN0X3N0YXRlICptYWluLAotCQlzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSBtYWluLT5ub2RlOwotCXN0cnVjdCBkc3Rfc2VjdXJlICpzZW50cnk7Ci0Jc3RydWN0IGRzdF9zZWN1cmVfdXNlciAqczsKLQlzdHJ1Y3Qgc2FkZHIgKnNhID0gJnN0LT5jdGwuYWRkcjsKLQl1bnNpZ25lZCBpbnQgcGVybSA9IDA7Ci0KLQltdXRleF9sb2NrKCZuLT5zZWN1cml0eV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlbnRyeSwgJm4tPnNlY3VyaXR5X2xpc3QsIHNlY19lbnRyeSkgewotCQlzID0gJnNlbnRyeS0+c2VjOwotCi0JCWlmIChzLT5hZGRyLnNhX2ZhbWlseSAhPSBzYS0+c2FfZmFtaWx5KQotCQkJY29udGludWU7Ci0KLQkJaWYgKHMtPmFkZHIuc2FfZGF0YV9sZW4gIT0gc2EtPnNhX2RhdGFfbGVuKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogVGhpcyAnMicgYmVsb3cgaXMgYSBwb3J0IGZpZWxkLiBUaGlzIG1heSBiZSB2ZXJ5IHdyb25nIHRvIGRvCi0JCSAqIGluIGF0YWxrIGZvciBleGFtcGxlIHRob3VnaC4gSWYgdGhlcmUgd2lsbCBiZSBhbnkgbmVlZAotCQkgKiB0byBleHRlbnQgcHJvdG9jb2wgdG8gc29tZXRoaW5nIGVsc2UsIEkgY2FuIGNyZWF0ZQotCQkgKiBwZXItZmFtaWx5IGhlbHBlcnMgYW5kIHVzZSB0aGVtIGluc3RlYWQgb2YgdGhpcyBtZW1jbXAuCi0JCSAqLwotCQlpZiAobWVtY21wKHMtPmFkZHIuc2FfZGF0YSArIDIsIHNhLT5zYV9kYXRhICsgMiwKLQkJCQkJc2EtPnNhX2RhdGFfbGVuIC0gMikpCi0JCQljb250aW51ZTsKLQotCQlwZXJtID0gcy0+cGVybWlzc2lvbnM7Ci0JfQotCW11dGV4X3VubG9jaygmbi0+c2VjdXJpdHlfbG9jayk7Ci0KLQlyZXR1cm4gcGVybTsKLX0KLQotLyoKLSAqIEFjY2VwdCBuZXcgY2xpZW50OiBhbGxvY2F0ZSBhcHByb3ByaWF0ZSBuZXR3b3JrIHN0YXRlIGFuZCBjaGVjayBwZXJtaXNzaW9ucy4KLSAqLwotc3RhdGljIHN0cnVjdCBkc3Rfc3RhdGUgKmRzdF9hY2NlcHRfY2xpZW50KHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQotewotCXVuc2lnbmVkIGludCByZXZlbnRzID0gMDsKLQl1bnNpZ25lZCBpbnQgZXJyX21hc2sgPSBQT0xMRVJSIHwgUE9MTEhVUCB8IFBPTExSREhVUDsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IGVycl9tYXNrIHwgUE9MTElOOwotCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IHN0LT5ub2RlOwotCWludCBlcnIgPSAwOwotCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBOVUxMOwotCXN0cnVjdCBkc3Rfc3RhdGUgKm5ldzsKLQotCXdoaWxlICghZXJyICYmICFzb2NrKSB7Ci0JCXJldmVudHMgPSBkc3Rfc3RhdGVfcG9sbChzdCk7Ci0KLQkJaWYgKCEocmV2ZW50cyAmIG1hc2spKSB7Ci0JCQlERUZJTkVfV0FJVCh3YWl0KTsKLQotCQkJZm9yICg7OykgewotCQkJCXByZXBhcmVfdG9fd2FpdCgmc3QtPnRocmVhZF93YWl0LAotCQkJCQkJJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJaWYgKCFuLT50cmFuc19zY2FuX3RpbWVvdXQgfHwgc3QtPm5lZWRfZXhpdCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlyZXZlbnRzID0gZHN0X3N0YXRlX3BvbGwoc3QpOwotCi0JCQkJaWYgKHJldmVudHMgJiBtYXNrKQotCQkJCQlicmVhazsKLQotCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvKgotCQkJCSAqIE1hZ2ljIEhaPyBQb2xsaW5nIGNoZWNrIGFib3ZlIGlzIG5vdCBzYWZlIGluCi0JCQkJICogYWxsIGNhc2VzIChsaWtlIHNvY2tldCByZXNldCBpbiBCSCBjb250ZXh0KSwKLQkJCQkgKiBzbyBpdCBpcyBzaW1wbGVyIGp1c3QgdG8gcG9zdHBvbmUgaXQgdG8gdGhlCi0JCQkJICogcHJvY2VzcyBjb250ZXh0IGluc3RlYWQgb2YgaW1wbGVtZW50aW5nCi0JCQkJICogc3BlY2lhbCBsb2NraW5nIHRoZXJlLgotCQkJCSAqLwotCQkJCXNjaGVkdWxlX3RpbWVvdXQoSFopOwotCQkJfQotCQkJZmluaXNoX3dhaXQoJnN0LT50aHJlYWRfd2FpdCwgJndhaXQpOwotCQl9Ci0KLQkJZXJyID0gLUVDT05OUkVTRVQ7Ci0JCWRzdF9zdGF0ZV9sb2NrKHN0KTsKLQotCQlkcHJpbnRrKCIlczogc3Q6ICVwLCByZXZlbnRzOiAleCBbZXJyOiAlZCwgaW46ICVkXS5cbiIsCi0JCQlfX2Z1bmNfXywgc3QsIHJldmVudHMsIHJldmVudHMgJiBlcnJfbWFzaywKLQkJCXJldmVudHMgJiBQT0xMSU4pOwotCi0JCWlmIChyZXZlbnRzICYgZXJyX21hc2spIHsKLQkJCWRwcmludGsoIiVzOiByZXZlbnRzOiAleCwgc29ja2V0OiAlcCwgZXJyOiAlZC5cbiIsCi0JCQkJCV9fZnVuY19fLCByZXZlbnRzLCBzdC0+c29ja2V0LCBlcnIpOwotCQkJZXJyID0gLUVDT05OUkVTRVQ7Ci0JCX0KLQotCQlpZiAoIW4tPnRyYW5zX3NjYW5fdGltZW91dCB8fCBzdC0+bmVlZF9leGl0KQotCQkJZXJyID0gLUVOT0RFVjsKLQotCQlpZiAoc3QtPnNvY2tldCAmJiAocmV2ZW50cyAmIFBPTExJTikpCi0JCQllcnIgPSBrZXJuZWxfYWNjZXB0KHN0LT5zb2NrZXQsICZzb2NrLCAwKTsKLQotCQlkc3Rfc3RhdGVfdW5sb2NrKHN0KTsKLQl9Ci0KLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCW5ldyA9IGRzdF9zdGF0ZV9hbGxvYyhzdC0+bm9kZSk7Ci0JaWYgKElTX0VSUihuZXcpKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dF9yZWxlYXNlOwotCX0KLQluZXctPnNvY2tldCA9IHNvY2s7Ci0KLQluZXctPmN0bC5hZGRyLnNhX2RhdGFfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7Ci0JZXJyID0ga2VybmVsX2dldHBlZXJuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmbmV3LT5jdGwuYWRkciwKLQkJCShpbnQgKikmbmV3LT5jdGwuYWRkci5zYV9kYXRhX2xlbik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X3B1dDsKLQotCW5ldy0+cGVybWlzc2lvbnMgPSBkc3RfY2hlY2tfcGVybWlzc2lvbnMoc3QsIG5ldyk7Ci0JaWYgKG5ldy0+cGVybWlzc2lvbnMgPT0gMCkgewotCQllcnIgPSAtRVBFUk07Ci0JCWRzdF9kdW1wX2FkZHIoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZuZXctPmN0bC5hZGRyLAotCQkJCSJDbGllbnQgaXMgbm90IGFsbG93ZWQgdG8gY29ubmVjdCIpOwotCQlnb3RvIGVycl9vdXRfcHV0OwotCX0KLQotCWVyciA9IGRzdF9wb2xsX2luaXQobmV3KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfcHV0OwotCi0JZHN0X2R1bXBfYWRkcihzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJm5ldy0+Y3RsLmFkZHIsCi0JCQkiQ29ubmVjdGVkIGNsaWVudCIpOwotCi0JcmV0dXJuIG5ldzsKLQotZXJyX291dF9wdXQ6Ci0JZHN0X3N0YXRlX3B1dChuZXcpOwotZXJyX291dF9yZWxlYXNlOgotCXNvY2tfcmVsZWFzZShzb2NrKTsKLWVycl9vdXRfZXhpdDoKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi0vKgotICogRWFjaCBzZXJ2ZXIncyBibG9jayByZXF1ZXN0IHNvbWV0aW1lIGZpbmlzaGVzLgotICogVXN1YWxseSBpdCBoYXBwZW5zIGluIGhhcmQgaXJxIGNvbnRleHQgb2YgdGhlIGFwcHJvcHJpYXRlIGNvbnRyb2xsZXIsCi0gKiBzbyB0byBwbGF5IGdvb2Qgd2l0aCBhbGwgY2FzZXMgd2UganVzdCBxdWV1ZSBCSU8gaW50byB0aGUgcXVldWUKLSAqIGFuZCB3YWtlIHVwIHByb2Nlc3NpbmcgdGhyZWFkLCB3aGljaCBnZXRzIGNvbXBsZXRlZCByZXF1ZXN0IGFuZAotICogc2VuZCAoZW5jcnlwdGluZyBpZiBuZWVkZWQpIGl0IGJhY2sgdG8gdGhlIGNsaWVudCAoaWYgaXQgd2FzIGEgcmVhZAotICogcmVxdWVzdCksIG9yIHNlbmRzIGJhY2sgcmVwbHkgdGhhdCB3cml0aW5nIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X2V4cG9ydF9wcm9jZXNzX3JlcXVlc3RfcXVldWUoc3RydWN0IGRzdF9zdGF0ZSAqc3QpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZHN0X2V4cG9ydF9wcml2ICpwID0gTlVMTDsKLQlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IGVyciA9IDA7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnN0LT5yZXF1ZXN0X2xpc3QpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdC0+cmVxdWVzdF9sb2NrLCBmbGFncyk7Ci0JCWlmICghbGlzdF9lbXB0eSgmc3QtPnJlcXVlc3RfbGlzdCkpIHsKLQkJCXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzdC0+cmVxdWVzdF9saXN0LAotCQkJCXN0cnVjdCBkc3RfZXhwb3J0X3ByaXYsIHJlcXVlc3RfZW50cnkpOwotCQkJbGlzdF9kZWwoJnAtPnJlcXVlc3RfZW50cnkpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0LT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKLQotCQlpZiAoIXApCi0JCQlicmVhazsKLQotCQliaW8gPSBwLT5iaW87Ci0KLQkJaWYgKGRzdF9uZWVkX2NyeXB0byhzdC0+bm9kZSkgJiYgKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpKQotCQkJZXJyID0gZHN0X2V4cG9ydF9jcnlwdG8oc3QtPm5vZGUsIGJpbyk7Ci0JCWVsc2UKLQkJCWVyciA9IGRzdF9leHBvcnRfc2VuZF9iaW8oYmlvKTsKLQotCQlpZiAoZXJyKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIENsZWFudXAgZXhwb3J0IHN0YXRlLgotICogSXQgaGFzIHRvIHdhaXQgdW50aWwgYWxsIHJlcXVlc3RzIGFyZSBmaW5pc2hlZCwKLSAqIGFuZCB0aGVuIGZyZWUgdGhlbSBhbGwuCi0gKi8KLXN0YXRpYyB2b2lkIGRzdF9zdGF0ZV9jbGVhbnVwX2V4cG9ydChzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQlzdHJ1Y3QgZHN0X2V4cG9ydF9wcml2ICpwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKgotCSAqIFRoaXMgbG9vcCB3YWl0cyBmb3IgYWxsIHBlbmRpbmcgYmlvcyB0byBiZSBjb21wbGV0ZWQgYW5kIGZyZWVkLgotCSAqLwotCXdoaWxlIChhdG9taWNfcmVhZCgmc3QtPnJlZmNudCkgPiAxKSB7Ci0JCWRwcmludGsoIiVzOiBzdDogJXAsIHJlZmNudDogJWQsIGxpc3RfZW1wdHk6ICVkLlxuIiwKLQkJCQlfX2Z1bmNfXywgc3QsIGF0b21pY19yZWFkKCZzdC0+cmVmY250KSwKLQkJCQlsaXN0X2VtcHR5KCZzdC0+cmVxdWVzdF9saXN0KSk7Ci0JCXdhaXRfZXZlbnRfdGltZW91dChzdC0+dGhyZWFkX3dhaXQsCi0JCQkJKGF0b21pY19yZWFkKCZzdC0+cmVmY250KSA9PSAxKSB8fAotCQkJCSFsaXN0X2VtcHR5KCZzdC0+cmVxdWVzdF9saXN0KSwKLQkJCQlIWi8yKTsKLQotCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnN0LT5yZXF1ZXN0X2xpc3QpKSB7Ci0JCQlwID0gTlVMTDsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdC0+cmVxdWVzdF9sb2NrLCBmbGFncyk7Ci0JCQlpZiAoIWxpc3RfZW1wdHkoJnN0LT5yZXF1ZXN0X2xpc3QpKSB7Ci0JCQkJcCA9IGxpc3RfZmlyc3RfZW50cnkoJnN0LT5yZXF1ZXN0X2xpc3QsCi0JCQkJCXN0cnVjdCBkc3RfZXhwb3J0X3ByaXYsIHJlcXVlc3RfZW50cnkpOwotCQkJCWxpc3RfZGVsKCZwLT5yZXF1ZXN0X2VudHJ5KTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0LT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHApCi0JCQkJYmlvX3B1dChwLT5iaW8pOwotCi0JCQlkcHJpbnRrKCIlczogc3Q6ICVwLCByZWZjbnQ6ICVkLCBsaXN0X2VtcHR5OiAlZCwgcDogIgotCQkJCSIlcC5cbiIsIF9fZnVuY19fLCBzdCwgYXRvbWljX3JlYWQoJnN0LT5yZWZjbnQpLAotCQkJCWxpc3RfZW1wdHkoJnN0LT5yZXF1ZXN0X2xpc3QpLCBwKTsKLQkJfQotCX0KLQotCWRzdF9zdGF0ZV9wdXQoc3QpOwotfQotCi0vKgotICogQ2xpZW50IGFjY2VwdGluZyB0aHJlYWQuCi0gKiBOb3Qgb25seSBhY2NlcHRzIG5ldyBjb25uZWN0aW9uLCBidXQgYWxzbyBzY2hlZHVsZXMgcmVjZWl2aW5nIHRocmVhZAotICogYW5kIHBlcmZvcm1zIHJlcXVlc3QgY29tcGxldGlvbiBkZXNjcmliZWQgYWJvdmUuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X2FjY2VwdCh2b2lkICppbml0X2RhdGEsIHZvaWQgKnNjaGVkdWxlX2RhdGEpCi17Ci0Jc3RydWN0IGRzdF9zdGF0ZSAqbWFpbl9zdCA9IHNjaGVkdWxlX2RhdGE7Ci0Jc3RydWN0IGRzdF9ub2RlICpuID0gaW5pdF9kYXRhOwotCXN0cnVjdCBkc3Rfc3RhdGUgKnN0OwotCWludCBlcnI7Ci0KLQl3aGlsZSAobi0+dHJhbnNfc2Nhbl90aW1lb3V0ICYmICFtYWluX3N0LT5uZWVkX2V4aXQpIHsKLQkJZHByaW50aygiJXM6IG1haW5fc3Q6ICVwLCBuOiAlcC5cbiIsIF9fZnVuY19fLCBtYWluX3N0LCBuKTsKLQkJc3QgPSBkc3RfYWNjZXB0X2NsaWVudChtYWluX3N0KTsKLQkJaWYgKElTX0VSUihzdCkpCi0JCQljb250aW51ZTsKLQotCQllcnIgPSBkc3Rfc3RhdGVfc2NoZWR1bGVfcmVjZWl2ZXIoc3QpOwotCQlpZiAoIWVycikgewotCQkJd2hpbGUgKG4tPnRyYW5zX3NjYW5fdGltZW91dCkgewotCQkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHN0LT50aHJlYWRfd2FpdCwKLQkJCQkJIWxpc3RfZW1wdHkoJnN0LT5yZXF1ZXN0X2xpc3QpIHx8Ci0JCQkJCSFuLT50cmFuc19zY2FuX3RpbWVvdXQgfHwKLQkJCQkJc3QtPm5lZWRfZXhpdCwKLQkJCQkJSFopOwotCi0JCQkJaWYgKCFuLT50cmFuc19zY2FuX3RpbWVvdXQgfHwgc3QtPm5lZWRfZXhpdCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAobGlzdF9lbXB0eSgmc3QtPnJlcXVlc3RfbGlzdCkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJZXJyID0gZHN0X2V4cG9ydF9wcm9jZXNzX3JlcXVlc3RfcXVldWUoc3QpOwotCQkJCWlmIChlcnIpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlzdC0+bmVlZF9leGl0ID0gMTsKLQkJCXdha2VfdXAoJnN0LT50aHJlYWRfd2FpdCk7Ci0JCX0KLQotCQlkc3Rfc3RhdGVfY2xlYW51cF9leHBvcnQoc3QpOwotCX0KLQotCWRwcmludGsoIiVzOiBmcmVlaW5nIGxpc3RlbmluZyBzb2NrZXQgc3Q6ICVwLlxuIiwgX19mdW5jX18sIG1haW5fc3QpOwotCi0JZHN0X3N0YXRlX2xvY2sobWFpbl9zdCk7Ci0JZHN0X3BvbGxfZXhpdChtYWluX3N0KTsKLQlkc3Rfc3RhdGVfc29ja2V0X3JlbGVhc2UobWFpbl9zdCk7Ci0JZHN0X3N0YXRlX3VubG9jayhtYWluX3N0KTsKLQlkc3Rfc3RhdGVfcHV0KG1haW5fc3QpOwotCWRwcmludGsoIiVzOiBmcmVlZCBsaXN0ZW5pbmcgc29ja2V0IHN0OiAlcC5cbiIsIF9fZnVuY19fLCBtYWluX3N0KTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZHN0X3N0YXJ0X2V4cG9ydChzdHJ1Y3QgZHN0X25vZGUgKm4pCi17Ci0JaWYgKGxpc3RfZW1wdHkoJm4tPnNlY3VyaXR5X2xpc3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiWW91IGFyZSB0cnlpbmcgdG8gZXhwb3J0IG5vZGUgJyVzJyAiCi0JCQkJIndpdGhvdXQgc2VjdXJpdHkgYXR0cmlidXRlcy5cbk5vIGNsaWVudHMgd2lsbCAiCi0JCQkJImJlIGFsbG93ZWQgdG8gY29ubmVjdC4gRXhpdGluZy5cbiIsIG4tPm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIGRzdF9ub2RlX3RyYW5zX2luaXQobiwgc2l6ZW9mKHN0cnVjdCBkc3RfZXhwb3J0X3ByaXYpKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgbGlzdGVuaW5nIHN0YXRlIGFuZCBzY2hlZHVsZSBhY2NlcHRpbmcgdGhyZWFkLgotICovCi1pbnQgZHN0X25vZGVfaW5pdF9saXN0ZW5lZChzdHJ1Y3QgZHN0X25vZGUgKm4sIHN0cnVjdCBkc3RfZXhwb3J0X2N0bCAqbGUpCi17Ci0Jc3RydWN0IGRzdF9zdGF0ZSAqc3Q7Ci0JaW50IGVyciA9IC1FTk9NRU07Ci0Jc3RydWN0IGRzdF9uZXR3b3JrX2N0bCAqY3RsID0gJmxlLT5jdGw7Ci0KLQltZW1jcHkoJm4tPmluZm8tPm5ldCwgY3RsLCBzaXplb2Yoc3RydWN0IGRzdF9uZXR3b3JrX2N0bCkpOwotCi0Jc3QgPSBkc3Rfc3RhdGVfYWxsb2Mobik7Ci0JaWYgKElTX0VSUihzdCkpIHsKLQkJZXJyID0gUFRSX0VSUihzdCk7Ci0JCWdvdG8gZXJyX291dF9leGl0OwotCX0KLQltZW1jcHkoJnN0LT5jdGwsIGN0bCwgc2l6ZW9mKHN0cnVjdCBkc3RfbmV0d29ya19jdGwpKTsKLQotCWVyciA9IGRzdF9zdGF0ZV9zb2NrZXRfY3JlYXRlKHN0KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfcHV0OwotCi0Jc3QtPnNvY2tldC0+c2stPnNrX3JldXNlID0gMTsKLQotCWVyciA9IGtlcm5lbF9iaW5kKHN0LT5zb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmY3RsLT5hZGRyLAotCQkJY3RsLT5hZGRyLnNhX2RhdGFfbGVuKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfc29ja2V0X3JlbGVhc2U7Ci0KLQllcnIgPSBrZXJuZWxfbGlzdGVuKHN0LT5zb2NrZXQsIDEwMjQpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF9zb2NrZXRfcmVsZWFzZTsKLQluLT5zdGF0ZSA9IHN0OwotCi0JZXJyID0gZHN0X3BvbGxfaW5pdChzdCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X3NvY2tldF9yZWxlYXNlOwotCi0JZHN0X3N0YXRlX2dldChzdCk7Ci0KLQllcnIgPSB0aHJlYWRfcG9vbF9zY2hlZHVsZShuLT5wb29sLCBkc3RfdGhyZWFkX3NldHVwLAotCQkJZHN0X2FjY2VwdCwgc3QsIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfcG9sbF9leGl0OwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfcG9sbF9leGl0OgotCWRzdF9wb2xsX2V4aXQoc3QpOwotZXJyX291dF9zb2NrZXRfcmVsZWFzZToKLQlkc3Rfc3RhdGVfc29ja2V0X3JlbGVhc2Uoc3QpOwotZXJyX291dF9wdXQ6Ci0JZHN0X3N0YXRlX3B1dChzdCk7Ci1lcnJfb3V0X2V4aXQ6Ci0Jbi0+c3RhdGUgPSBOVUxMOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBGcmVlIGJpbyBhbmQgcmVsYXRlZCBwcml2YXRlIGRhdGEuCi0gKiBBbHNvIGRyb3AgYSByZWZlcmVuY2UgY291bnRlciBmb3IgYXBwcm9wcmlhdGUgc3RhdGUsCi0gKiB3aGljaCB3YWl0cyB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGJsb2NrIElPcyBpbi1mbGlnaHQuCi0gKi8KLXN0YXRpYyB2b2lkIGRzdF9iaW9fZGVzdHJ1Y3RvcihzdHJ1Y3QgYmlvICpiaW8pCi17Ci0Jc3RydWN0IGJpb192ZWMgKmJ2OwotCXN0cnVjdCBkc3RfZXhwb3J0X3ByaXYgKnByaXYgPSBiaW8tPmJpX3ByaXZhdGU7Ci0JaW50IGk7Ci0KLQliaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpKSB7Ci0JCWlmICghYnYtPmJ2X3BhZ2UpCi0JCQlicmVhazsKLQotCQlfX2ZyZWVfcGFnZShidi0+YnZfcGFnZSk7Ci0JfQotCi0JaWYgKHByaXYpCi0JCWRzdF9zdGF0ZV9wdXQocHJpdi0+c3RhdGUpOwotCWJpb19mcmVlKGJpbywgZHN0X2Jpb19zZXQpOwotfQotCi0vKgotICogQmxvY2sgSU8gY29tcGxldGlvbi4gUXVldWUgcmVxdWVzdCB0byBiZSBzZW50IGJhY2sgdG8KLSAqIHRoZSBjbGllbnQgKG9yIGp1c3QgY29uZmlybWF0aW9uKS4KLSAqLwotc3RhdGljIHZvaWQgZHN0X2Jpb19lbmRfaW8oc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQotewotCXN0cnVjdCBkc3RfZXhwb3J0X3ByaXYgKnAgPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGRzdF9zdGF0ZSAqc3QgPSBwLT5zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0LT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZwLT5yZXF1ZXN0X2VudHJ5LCAmc3QtPnJlcXVlc3RfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3QtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOwotCi0Jd2FrZV91cCgmc3QtPnRocmVhZF93YWl0KTsKLX0KLQotLyoKLSAqIEFsbG9jYXRlIHJlYWQgcmVxdWVzdCBmb3IgdGhlIHNlcnZlci4KLSAqLwotc3RhdGljIGludCBkc3RfZXhwb3J0X3JlYWRfcmVxdWVzdChzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCB0b3RhbF9zaXplKQotewotCXVuc2lnbmVkIGludCBzaXplOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCWludCBlcnI7Ci0KLQl3aGlsZSAodG90YWxfc2l6ZSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYWdlKQotCQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0KLQkJc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgUEFHRV9TSVpFLCB0b3RhbF9zaXplKTsKLQotCQllcnIgPSBiaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBzaXplLCAwKTsKLQkJZHByaW50aygiJXM6IGJpbzogJWxsdS8ldSwgc2l6ZTogJXUsIGVycjogJWQuXG4iLAotCQkJCV9fZnVuY19fLCAodTY0KWJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUsCi0JCQkJc2l6ZSwgZXJyKTsKLQkJaWYgKGVyciA8PSAwKQotCQkJZ290byBlcnJfb3V0X2ZyZWVfcGFnZTsKLQotCQl0b3RhbF9zaXplIC09IHNpemU7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZnJlZV9wYWdlOgotCV9fZnJlZV9wYWdlKHBhZ2UpOwotZXJyX291dF9leGl0OgotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBBbGxvY2F0ZSB3cml0ZSByZXF1ZXN0IGZvciB0aGUgc2VydmVyLgotICogU2hvdWxkIG5vdCBvbmx5IGdldCBwYWdlcywgYnV0IGFsc28gcmVhZCBkYXRhIGZyb20gdGhlIG5ldHdvcmsuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X2V4cG9ydF93cml0ZV9yZXF1ZXN0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0LAotCQlzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCB0b3RhbF9zaXplKQotewotCXVuc2lnbmVkIGludCBzaXplOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXZvaWQgKmRhdGE7Ci0JaW50IGVycjsKLQotCXdoaWxlICh0b3RhbF9zaXplKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAoIXBhZ2UpCi0JCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCQlkYXRhID0ga21hcChwYWdlKTsKLQkJaWYgKCFkYXRhKQotCQkJZ290byBlcnJfb3V0X2ZyZWVfcGFnZTsKLQotCQlzaXplID0gbWluX3QodW5zaWduZWQgaW50LCBQQUdFX1NJWkUsIHRvdGFsX3NpemUpOwotCi0JCWVyciA9IGRzdF9kYXRhX3JlY3Yoc3QsIGRhdGEsIHNpemUpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0X3VubWFwX3BhZ2U7Ci0KLQkJZXJyID0gYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgc2l6ZSwgMCk7Ci0JCWlmIChlcnIgPD0gMCkKLQkJCWdvdG8gZXJyX291dF91bm1hcF9wYWdlOwotCi0JCWt1bm1hcChwYWdlKTsKLQotCQl0b3RhbF9zaXplIC09IHNpemU7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfdW5tYXBfcGFnZToKLQlrdW5tYXAocGFnZSk7Ci1lcnJfb3V0X2ZyZWVfcGFnZToKLQlfX2ZyZWVfcGFnZShwYWdlKTsKLWVycl9vdXRfZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogR3Jvb3Z5LCB3ZSd2ZSBnb3R0ZW4gYW4gSU8gcmVxdWVzdCBmcm9tIHRoZSBjbGllbnQuCi0gKiBBbGxvY2F0ZSBCSU8gZnJvbSB0aGUgYmlvc2V0LCBwcml2YXRlIGRhdGEgZnJvbSB0aGUgbWVtcG9vbAotICogYW5kIGxvdHMgb2YgcGFnZXMgZm9yIElPLgotICovCi1pbnQgZHN0X3Byb2Nlc3NfaW8oc3RydWN0IGRzdF9zdGF0ZSAqc3QpCi17Ci0Jc3RydWN0IGRzdF9ub2RlICpuID0gc3QtPm5vZGU7Ci0Jc3RydWN0IGRzdF9jbWQgKmNtZCA9IHN0LT5kYXRhOwotCXN0cnVjdCBiaW8gKmJpbzsKLQlzdHJ1Y3QgZHN0X2V4cG9ydF9wcml2ICpwcml2OwotCWludCBlcnIgPSAtRU5PTUVNOwotCi0JaWYgKHVubGlrZWx5KCFuLT5iZGV2KSkgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQl9Ci0KLQliaW8gPSBiaW9fYWxsb2NfYmlvc2V0KEdGUF9LRVJORUwsCi0JCQlQQUdFX0FMSUdOKGNtZC0+c2l6ZSkgPj4gUEFHRV9TSElGVCwKLQkJCWRzdF9iaW9fc2V0KTsKLQlpZiAoIWJpbykKLQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0KLQlwcml2ID0gKHN0cnVjdCBkc3RfZXhwb3J0X3ByaXYgKikoKCh2b2lkICopYmlvKSAtCi0JCQlzaXplb2YgKHN0cnVjdCBkc3RfZXhwb3J0X3ByaXYpKTsKLQotCXByaXYtPnN0YXRlID0gZHN0X3N0YXRlX2dldChzdCk7Ci0JcHJpdi0+YmlvID0gYmlvOwotCi0JYmlvLT5iaV9wcml2YXRlID0gcHJpdjsKLQliaW8tPmJpX2VuZF9pbyA9IGRzdF9iaW9fZW5kX2lvOwotCWJpby0+YmlfZGVzdHJ1Y3RvciA9IGRzdF9iaW9fZGVzdHJ1Y3RvcjsKLQliaW8tPmJpX2JkZXYgPSBuLT5iZGV2OwotCi0JLyoKLQkgKiBTZXJ2ZXIgc2lkZSBpcyBvbmx5IGludGVyZXN0ZWQgaW4gdHdvIGxvdyBiaXRzOgotCSAqIHVwdG9kYXRlIChzZXQgYnkgaXRzZWxmIGFjdHVhbGx5KSBhbmQgcncgYmxvY2sKLQkgKi8KLQliaW8tPmJpX2ZsYWdzIHw9IGNtZC0+ZmxhZ3MgJiAzOwotCi0JYmlvLT5iaV9ydyA9IGNtZC0+cnc7Ci0JYmlvLT5iaV9zaXplID0gMDsKLQliaW8tPmJpX3NlY3RvciA9IGNtZC0+c2VjdG9yOwotCi0JZHN0X2Jpb190b19jbWQoYmlvLCAmcHJpdi0+Y21kLCBEU1RfSU9fUkVTUE9OU0UsIGNtZC0+aWQpOwotCi0JcHJpdi0+Y21kLmZsYWdzID0gMDsKLQlwcml2LT5jbWQuc2l6ZSA9IGNtZC0+c2l6ZTsKLQotCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgewotCQllcnIgPSBkc3RfcmVjdl9jZGF0YShzdCwgcHJpdi0+Y21kLmhhc2gpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0KLQkJZXJyID0gZHN0X2V4cG9ydF93cml0ZV9yZXF1ZXN0KHN0LCBiaW8sIGNtZC0+c2l6ZSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXRfZnJlZTsKLQotCQlpZiAoZHN0X25lZWRfY3J5cHRvKG4pKQotCQkJcmV0dXJuIGRzdF9leHBvcnRfY3J5cHRvKG4sIGJpbyk7Ci0JfSBlbHNlIHsKLQkJZXJyID0gZHN0X2V4cG9ydF9yZWFkX3JlcXVlc3QoYmlvLCBjbWQtPnNpemUpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0JfQotCi0JZHByaW50aygiJXM6IGJpbzogJWxsdS8ldSwgcnc6ICVsdSwgZGlyOiAlbHUsIGZsYWdzOiAlbHgsIHBoeXM6ICVkLlxuIiwKLQkJCV9fZnVuY19fLCAodTY0KWJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUsCi0JCQliaW8tPmJpX3J3LCBiaW9fZGF0YV9kaXIoYmlvKSwKLQkJCWJpby0+YmlfZmxhZ3MsIGJpby0+YmlfcGh5c19zZWdtZW50cyk7Ci0KLQlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZnJlZToKLQliaW9fcHV0KGJpbyk7Ci1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIE9rLCBibG9jayBJTyBpcyByZWFkeSwgbGV0J3Mgc2VuZCBpdCBiYWNrIHRvIHRoZSBjbGllbnQuLi4KLSAqLwotaW50IGRzdF9leHBvcnRfc2VuZF9iaW8oc3RydWN0IGJpbyAqYmlvKQotewotCXN0cnVjdCBkc3RfZXhwb3J0X3ByaXYgKnAgPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGRzdF9zdGF0ZSAqc3QgPSBwLT5zdGF0ZTsKLQlzdHJ1Y3QgZHN0X2NtZCAqY21kID0gJnAtPmNtZDsKLQlpbnQgZXJyOwotCi0JZHByaW50aygiJXM6IGlkOiAlbGx1LCBiaW86ICVsbHUvJXUsIGNzaXplOiAldSwgZmxhZ3M6ICVsdSwgcnc6ICVsdS5cbiIsCi0JCQlfX2Z1bmNfXywgY21kLT5pZCwgKHU2NCliaW8tPmJpX3NlY3RvciwgYmlvLT5iaV9zaXplLAotCQkJY21kLT5jc2l6ZSwgYmlvLT5iaV9mbGFncywgYmlvLT5iaV9ydyk7Ci0KLQlkc3RfY29udmVydF9jbWQoY21kKTsKLQotCWRzdF9zdGF0ZV9sb2NrKHN0KTsKLQlpZiAoIXN0LT5zb2NrZXQpIHsKLQkJZXJyID0gLUVDT05OUkVTRVQ7Ci0JCWdvdG8gZXJyX291dF91bmxvY2s7Ci0JfQotCi0JaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFKSB7Ci0JCS8qIC4uLiBvciBqdXN0IGNvbmZpcm1hdGlvbiB0aGF0IHdyaXRpbmcgaGFzIGNvbXBsZXRlZC4gKi8KLQkJY21kLT5zaXplID0gY21kLT5jc2l6ZSA9IDA7Ci0JCWVyciA9IGRzdF9kYXRhX3NlbmRfaGVhZGVyKHN0LT5zb2NrZXQsIGNtZCwKLQkJCQlzaXplb2Yoc3RydWN0IGRzdF9jbWQpLCAwKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dF91bmxvY2s7Ci0JfSBlbHNlIHsKLQkJZXJyID0gZHN0X3NlbmRfYmlvKHN0LCBjbWQsIGJpbyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXRfdW5sb2NrOwotCX0KLQotCWRzdF9zdGF0ZV91bmxvY2soc3QpOwotCi0JYmlvX3B1dChiaW8pOwotCXJldHVybiAwOwotCi1lcnJfb3V0X3VubG9jazoKLQlkc3Rfc3RhdGVfdW5sb2NrKHN0KTsKLQotCWJpb19wdXQoYmlvKTsKLQlyZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC9zdGF0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2RzdC9zdGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmEwNWU2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3Qvc3RhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDg0NCArMCwwIEBACi0vKgotICogMjAwNysgQ29weXJpZ2h0IChjKSBFdmdlbml5IFBvbHlha292IDx6YnJAaW9yZW1hcC5uZXQ+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9iaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9jb25uZWN0b3IuaD4KLSNpbmNsdWRlIDxsaW51eC9kc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2luNi5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0KLS8qCi0gKiBQb2xsaW5nIG1hY2hpbmVyeS4KLSAqLwotCi1zdHJ1Y3QgZHN0X3BvbGxfaGVscGVyIHsKLQlwb2xsX3RhYmxlCQlwdDsKLQlzdHJ1Y3QgZHN0X3N0YXRlCSpzdDsKLX07Ci0KLXN0YXRpYyBpbnQgZHN0X3F1ZXVlX3dha2Uod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLAotCQlpbnQgc3luYywgdm9pZCAqa2V5KQotewotCXN0cnVjdCBkc3Rfc3RhdGUgKnN0ID0gY29udGFpbmVyX29mKHdhaXQsIHN0cnVjdCBkc3Rfc3RhdGUsIHdhaXQpOwotCi0Jd2FrZV91cCgmc3QtPnRocmVhZF93YWl0KTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgZHN0X3F1ZXVlX2Z1bmMoc3RydWN0IGZpbGUgKmZpbGUsIHdhaXRfcXVldWVfaGVhZF90ICp3aGVhZCwKLQkJCQkgcG9sbF90YWJsZSAqcHQpCi17Ci0Jc3RydWN0IGRzdF9zdGF0ZSAqc3QgPSBjb250YWluZXJfb2YocHQsIHN0cnVjdCBkc3RfcG9sbF9oZWxwZXIsIHB0KS0+c3Q7Ci0KLQlzdC0+d2hlYWQgPSB3aGVhZDsKLQlpbml0X3dhaXRxdWV1ZV9mdW5jX2VudHJ5KCZzdC0+d2FpdCwgZHN0X3F1ZXVlX3dha2UpOwotCWFkZF93YWl0X3F1ZXVlKHdoZWFkLCAmc3QtPndhaXQpOwotfQotCi12b2lkIGRzdF9wb2xsX2V4aXQoc3RydWN0IGRzdF9zdGF0ZSAqc3QpCi17Ci0JaWYgKHN0LT53aGVhZCkgewotCQlyZW1vdmVfd2FpdF9xdWV1ZShzdC0+d2hlYWQsICZzdC0+d2FpdCk7Ci0JCXN0LT53aGVhZCA9IE5VTEw7Ci0JfQotfQotCi1pbnQgZHN0X3BvbGxfaW5pdChzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQlzdHJ1Y3QgZHN0X3BvbGxfaGVscGVyIHBoOwotCi0JcGguc3QgPSBzdDsKLQlpbml0X3BvbGxfZnVuY3B0cigmcGgucHQsICZkc3RfcXVldWVfZnVuYyk7Ci0KLQlzdC0+c29ja2V0LT5vcHMtPnBvbGwoTlVMTCwgc3QtPnNvY2tldCwgJnBoLnB0KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEhlYWRlciByZWNlaXZpbmcgZnVuY3Rpb24gLSBtYXkgYmxvY2suCi0gKi8KLXN0YXRpYyBpbnQgZHN0X2RhdGFfcmVjdl9oZWFkZXIoc3RydWN0IHNvY2tldCAqc29jaywKLQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIGludCBibG9jaykKLXsKLQlzdHJ1Y3QgbXNnaGRyIG1zZzsKLQlzdHJ1Y3Qga3ZlYyBpb3Y7Ci0JaW50IGVycjsKLQotCWlvdi5pb3ZfYmFzZSA9IGRhdGE7Ci0JaW92Lmlvdl9sZW4gPSBzaXplOwotCi0JbXNnLm1zZ19pb3YgPSAoc3RydWN0IGlvdmVjICopJmlvdjsKLQltc2cubXNnX2lvdmxlbiA9IDE7Ci0JbXNnLm1zZ19uYW1lID0gTlVMTDsKLQltc2cubXNnX25hbWVsZW4gPSAwOwotCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQltc2cubXNnX2ZsYWdzID0gKGJsb2NrKSA/IE1TR19XQUlUQUxMIDogTVNHX0RPTlRXQUlUOwotCi0JZXJyID0ga2VybmVsX3JlY3Ztc2coc29jaywgJm1zZywgJmlvdiwgMSwgaW92Lmlvdl9sZW4sCi0JCQltc2cubXNnX2ZsYWdzKTsKLQlpZiAoZXJyICE9IHNpemUpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogSGVhZGVyIHNlbmRpbmcgZnVuY3Rpb24gLSBtYXkgYmxvY2suCi0gKi8KLWludCBkc3RfZGF0YV9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IG1vcmUpCi17Ci0Jc3RydWN0IG1zZ2hkciBtc2c7Ci0Jc3RydWN0IGt2ZWMgaW92OwotCWludCBlcnI7Ci0KLQlpb3YuaW92X2Jhc2UgPSBkYXRhOwotCWlvdi5pb3ZfbGVuID0gc2l6ZTsKLQotCW1zZy5tc2dfaW92ID0gKHN0cnVjdCBpb3ZlYyAqKSZpb3Y7Ci0JbXNnLm1zZ19pb3ZsZW4gPSAxOwotCW1zZy5tc2dfbmFtZSA9IE5VTEw7Ci0JbXNnLm1zZ19uYW1lbGVuID0gMDsKLQltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncyA9IE1TR19XQUlUQUxMIHwgKG1vcmUgPyBNU0dfTU9SRSA6IDApOwotCi0JZXJyID0ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJmlvdiwgMSwgaW92Lmlvdl9sZW4pOwotCWlmIChlcnIgIT0gc2l6ZSkgewotCQlkcHJpbnRrKCIlczogc2l6ZTogJXUsIG1vcmU6ICVkLCBlcnI6ICVkLlxuIiwKLQkJCQlfX2Z1bmNfXywgc2l6ZSwgbW9yZSwgZXJyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogQmxvY2sgYXV0b2NvbmZpZ3VyYXRpb246IHJlcXVlc3Qgc2l6ZSBvZiB0aGUgc3RvcmFnZSBhbmQgcGVybWlzc2lvbnMuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X3JlcXVlc3RfcmVtb3RlX2NvbmZpZyhzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSBzdC0+bm9kZTsKLQlpbnQgZXJyID0gLUVJTlZBTDsKLQlzdHJ1Y3QgZHN0X2NtZCAqY21kID0gc3QtPmRhdGE7Ci0KLQltZW1zZXQoY21kLCAwLCBzaXplb2Yoc3RydWN0IGRzdF9jbWQpKTsKLQljbWQtPmNtZCA9IERTVF9DRkc7Ci0KLQlkc3RfY29udmVydF9jbWQoY21kKTsKLQotCWVyciA9IGRzdF9kYXRhX3NlbmRfaGVhZGVyKHN0LT5zb2NrZXQsIGNtZCwgc2l6ZW9mKHN0cnVjdCBkc3RfY21kKSwgMCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBkc3RfZGF0YV9yZWN2X2hlYWRlcihzdC0+c29ja2V0LCBjbWQsIHNpemVvZihzdHJ1Y3QgZHN0X2NtZCksIDEpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JZHN0X2NvbnZlcnRfY21kKGNtZCk7Ci0KLQlpZiAoY21kLT5jbWQgIT0gRFNUX0NGRykgewotCQllcnIgPSAtRUlOVkFMOwotCQlkcHJpbnRrKCIlczogY2hlY2tpbmcgcmVzdWx0OiBjbWQ6ICVkLCBzaXplIHJlcG9ydGVkOiAlbGx1LlxuIiwKLQkJCV9fZnVuY19fLCBjbWQtPmNtZCwgY21kLT5zZWN0b3IpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAobi0+c2l6ZSAhPSAwKQotCQluLT5zaXplID0gbWluX3QobG9mZl90LCBuLT5zaXplLCBjbWQtPnNlY3Rvcik7Ci0JZWxzZQotCQluLT5zaXplID0gY21kLT5zZWN0b3I7Ci0KLQluLT5pbmZvLT5zaXplID0gbi0+c2l6ZTsKLQlzdC0+cGVybWlzc2lvbnMgPSBjbWQtPnJ3OwotCi1vdXQ6Ci0JZHByaW50aygiJXM6IG46ICVwLCBlcnI6ICVkLCBzaXplOiAlbGx1LCBwZXJtaXNzaW9uOiAleC5cbiIsCi0JCQlfX2Z1bmNfXywgbiwgZXJyLCBuLT5zaXplLCBzdC0+cGVybWlzc2lvbnMpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBTb2NrZXQgbWFjaGluZXJ5LgotICovCi0KLSNkZWZpbmUgRFNUX0RFRkFVTFRfVElNRU8JMjAwMDAKLQotaW50IGRzdF9zdGF0ZV9zb2NrZXRfY3JlYXRlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQotewotCWludCBlcnI7Ci0Jc3RydWN0IHNvY2tldCAqc29jazsKLQlzdHJ1Y3QgZHN0X25ldHdvcmtfY3RsICpjdGwgPSAmc3QtPmN0bDsKLQotCWVyciA9IHNvY2tfY3JlYXRlKGN0bC0+YWRkci5zYV9mYW1pbHksIGN0bC0+dHlwZSwgY3RsLT5wcm90bywgJnNvY2spOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0Jc29jay0+c2stPnNrX3NuZHRpbWVvID0gc29jay0+c2stPnNrX3JjdnRpbWVvID0KLQkJbXNlY3NfdG9famlmZmllcyhEU1RfREVGQVVMVF9USU1FTyk7Ci0Jc29jay0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfTk9JTzsKLQotCXN0LT5zb2NrZXQgPSBzdC0+cmVhZF9zb2NrZXQgPSBzb2NrOwotCXJldHVybiAwOwotfQotCi12b2lkIGRzdF9zdGF0ZV9zb2NrZXRfcmVsZWFzZShzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQlkcHJpbnRrKCIlczogc3Q6ICVwLCBzb2NrZXQ6ICVwLCBuOiAlcC5cbiIsCi0JCQlfX2Z1bmNfXywgc3QsIHN0LT5zb2NrZXQsIHN0LT5ub2RlKTsKLQlpZiAoc3QtPnNvY2tldCkgewotCQlzb2NrX3JlbGVhc2Uoc3QtPnNvY2tldCk7Ci0JCXN0LT5zb2NrZXQgPSBOVUxMOwotCQlzdC0+cmVhZF9zb2NrZXQgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBkc3RfZHVtcF9hZGRyKHN0cnVjdCBzb2NrZXQgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBjaGFyICpzdHIpCi17Ci0JaWYgKHNrLT5vcHMtPmZhbWlseSA9PSBBRl9JTkVUKSB7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhOwotCQlwcmludGsoS0VSTl9JTkZPICIlcyAldS4ldS4ldS4ldTolZC5cbiIsIHN0ciwKLQkJCU5JUFFVQUQoc2luLT5zaW5fYWRkci5zX2FkZHIpLCBudG9ocyhzaW4tPnNpbl9wb3J0KSk7Ci0JfSBlbHNlIGlmIChzay0+b3BzLT5mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXBpNjolZCIsCi0JCQlzdHIsICZzaW4tPnNpbjZfYWRkciwgbnRvaHMoc2luLT5zaW42X3BvcnQpKTsKLQl9Ci19Ci0KLXZvaWQgZHN0X3N0YXRlX2V4aXRfY29ubmVjdGVkKHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQotewotCWlmIChzdC0+c29ja2V0KSB7Ci0JCWRzdF9wb2xsX2V4aXQoc3QpOwotCQlzdC0+c29ja2V0LT5vcHMtPnNodXRkb3duKHN0LT5zb2NrZXQsIDIpOwotCi0JCWRzdF9kdW1wX2FkZHIoc3QtPnNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzdC0+Y3RsLmFkZHIsCi0JCQkJIkRpc2Nvbm5lY3RlZCBwZWVyIik7Ci0JCWRzdF9zdGF0ZV9zb2NrZXRfcmVsZWFzZShzdCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGRzdF9zdGF0ZV9pbml0X2Nvbm5lY3RlZChzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBkc3RfbmV0d29ya19jdGwgKmN0bCA9ICZzdC0+Y3RsOwotCi0JZXJyID0gZHN0X3N0YXRlX3NvY2tldF9jcmVhdGUoc3QpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF9leGl0OwotCi0JZXJyID0ga2VybmVsX2Nvbm5lY3Qoc3QtPnNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzdC0+Y3RsLmFkZHIsCi0JCQlzdC0+Y3RsLmFkZHIuc2FfZGF0YV9sZW4sIDApOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF9yZWxlYXNlOwotCi0JZXJyID0gZHN0X3BvbGxfaW5pdChzdCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X3JlbGVhc2U7Ci0KLQlkc3RfZHVtcF9hZGRyKHN0LT5zb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmY3RsLT5hZGRyLAotCQkJIkNvbm5lY3RlZCB0byBwZWVyIik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX291dF9yZWxlYXNlOgotCWRzdF9zdGF0ZV9zb2NrZXRfcmVsZWFzZShzdCk7Ci1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIFN0YXRlIHJlc2V0IGlzIHVzZWQgdG8gcmVjb25uZWN0IHRvIHRoZSByZW1vdGUgcGVlci4KLSAqIE1heSBmYWlsLCBidXQgd2hvIGNhcmVzLCB3ZSB3aWxsIHRyeSBhZ2FpbiBsYXRlci4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGRzdF9zdGF0ZV9yZXNldF9ub2xvY2soc3RydWN0IGRzdF9zdGF0ZSAqc3QpCi17Ci0JZHN0X3N0YXRlX2V4aXRfY29ubmVjdGVkKHN0KTsKLQlkc3Rfc3RhdGVfaW5pdF9jb25uZWN0ZWQoc3QpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHN0X3N0YXRlX3Jlc2V0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQotewotCWRzdF9zdGF0ZV9sb2NrKHN0KTsKLQlkc3Rfc3RhdGVfcmVzZXRfbm9sb2NrKHN0KTsKLQlkc3Rfc3RhdGVfdW5sb2NrKHN0KTsKLX0KLQotLyoKLSAqIEJhc2ljIG5ldHdvcmsgc2VuZGluZy9yZWNlaXZpbmcgZnVuY3Rpb25zLgotICogQmxvY2tlZCBtb2RlIGlzIHVzZWQuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X2RhdGFfcmVjdl9yYXcoc3RydWN0IGRzdF9zdGF0ZSAqc3QsIHZvaWQgKmJ1ZiwgdTY0IHNpemUpCi17Ci0Jc3RydWN0IG1zZ2hkciBtc2c7Ci0Jc3RydWN0IGt2ZWMgaW92OwotCWludCBlcnI7Ci0KLQlCVUdfT04oIXNpemUpOwotCi0JaW92Lmlvdl9iYXNlID0gYnVmOwotCWlvdi5pb3ZfbGVuID0gc2l6ZTsKLQotCW1zZy5tc2dfaW92ID0gKHN0cnVjdCBpb3ZlYyAqKSZpb3Y7Ci0JbXNnLm1zZ19pb3ZsZW4gPSAxOwotCW1zZy5tc2dfbmFtZSA9IE5VTEw7Ci0JbXNnLm1zZ19uYW1lbGVuID0gMDsKLQltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncyA9IE1TR19ET05UV0FJVDsKLQotCWVyciA9IGtlcm5lbF9yZWN2bXNnKHN0LT5zb2NrZXQsICZtc2csICZpb3YsIDEsIGlvdi5pb3ZfbGVuLAotCQkJbXNnLm1zZ19mbGFncyk7Ci0JaWYgKGVyciA8PSAwKSB7Ci0JCWRwcmludGsoIiVzOiBmYWlsZWQgdG8gcmVjdiBkYXRhOiBzaXplOiAlbGx1LCBlcnI6ICVkLlxuIiwKLQkJCQlfX2Z1bmNfXywgc2l6ZSwgZXJyKTsKLQkJaWYgKGVyciA9PSAwKQotCQkJZXJyID0gLUVDT05OUkVTRVQ7Ci0KLQkJZHN0X3N0YXRlX2V4aXRfY29ubmVjdGVkKHN0KTsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogUGluZyBjb21tYW5kIHRvIGVhcmx5IGRldGVjdCBmYWlsZWQgbm9kZXMuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X3NlbmRfcGluZyhzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQlzdHJ1Y3QgZHN0X2NtZCAqY21kID0gc3QtPmRhdGE7Ci0JaW50IGVyciA9IC1FQ09OTlJFU0VUOwotCi0JZHN0X3N0YXRlX2xvY2soc3QpOwotCWlmIChzdC0+c29ja2V0KSB7Ci0JCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3QgZHN0X2NtZCkpOwotCi0JCWNtZC0+Y21kID0gX19jcHVfdG9fYmUzMihEU1RfUElORyk7Ci0KLQkJZXJyID0gZHN0X2RhdGFfc2VuZF9oZWFkZXIoc3QtPnNvY2tldCwgY21kLAotCQkJCXNpemVvZihzdHJ1Y3QgZHN0X2NtZCksIDApOwotCX0KLQlkcHJpbnRrKCIlczogc3Q6ICVwLCBzb2NrZXQ6ICVwLCBlcnI6ICVkLlxuIiwgX19mdW5jX18sCi0JCQlzdCwgc3QtPnNvY2tldCwgZXJyKTsKLQlkc3Rfc3RhdGVfdW5sb2NrKHN0KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBSZWNlaXZpbmcgZnVuY3Rpb24sIHdoaWNoIHNob3VsZCBlaXRoZXIgcmV0dXJuIGVycm9yIG9yIHJlYWQKLSAqIHdob2xlIGJsb2NrIHJlcXVlc3QuIElmIHRoZXJlIHdhcyBubyB0cmFmZmljIGZvciBhIG9uZSBzZWNvbmQsCi0gKiBzZW5kIGEgcGluZywgc2luY2UgcmVtb3RlIG5vZGUgbWF5IGRpZS4KLSAqLwotaW50IGRzdF9kYXRhX3JlY3Yoc3RydWN0IGRzdF9zdGF0ZSAqc3QsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplKQotewotCXVuc2lnbmVkIGludCByZXZlbnRzID0gMDsKLQl1bnNpZ25lZCBpbnQgZXJyX21hc2sgPSBQT0xMRVJSIHwgUE9MTEhVUCB8IFBPTExSREhVUDsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IGVycl9tYXNrIHwgUE9MTElOOwotCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IHN0LT5ub2RlOwotCWludCBlcnIgPSAwOwotCi0Jd2hpbGUgKHNpemUgJiYgIWVycikgewotCQlyZXZlbnRzID0gZHN0X3N0YXRlX3BvbGwoc3QpOwotCi0JCWlmICghKHJldmVudHMgJiBtYXNrKSkgewotCQkJREVGSU5FX1dBSVQod2FpdCk7Ci0KLQkJCWZvciAoOzspIHsKLQkJCQlwcmVwYXJlX3RvX3dhaXQoJnN0LT50aHJlYWRfd2FpdCwgJndhaXQsCi0JCQkJCQlUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCWlmICghbi0+dHJhbnNfc2Nhbl90aW1lb3V0IHx8IHN0LT5uZWVkX2V4aXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJcmV2ZW50cyA9IGRzdF9zdGF0ZV9wb2xsKHN0KTsKLQotCQkJCWlmIChyZXZlbnRzICYgbWFzaykKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KEhaKSkgewotCQkJCQllcnIgPSBkc3Rfc2VuZF9waW5nKHN0KTsKLQkJCQkJaWYgKGVycikKLQkJCQkJCXJldHVybiBlcnI7Ci0JCQkJfQotCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmaW5pc2hfd2FpdCgmc3QtPnRocmVhZF93YWl0LCAmd2FpdCk7Ci0JCX0KLQotCQllcnIgPSAtRUNPTk5SRVNFVDsKLQkJZHN0X3N0YXRlX2xvY2soc3QpOwotCi0JCWlmIChzdC0+c29ja2V0ICYmIChzdC0+cmVhZF9zb2NrZXQgPT0gc3QtPnNvY2tldCkgJiYKLQkJCQkocmV2ZW50cyAmIFBPTExJTikpIHsKLQkJCWVyciA9IGRzdF9kYXRhX3JlY3ZfcmF3KHN0LCBkYXRhLCBzaXplKTsKLQkJCWlmIChlcnIgPiAwKSB7Ci0JCQkJZGF0YSArPSBlcnI7Ci0JCQkJc2l6ZSAtPSBlcnI7Ci0JCQkJZXJyID0gMDsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXZlbnRzICYgZXJyX21hc2sgfHwgIXN0LT5zb2NrZXQpIHsKLQkJCWRwcmludGsoIiVzOiByZXZlbnRzOiAleCwgc29ja2V0OiAlcCwgc2l6ZTogJXUsICIKLQkJCQkJImVycjogJWQuXG4iLCBfX2Z1bmNfXywgcmV2ZW50cywKLQkJCQkJc3QtPnNvY2tldCwgc2l6ZSwgZXJyKTsKLQkJCWVyciA9IC1FQ09OTlJFU0VUOwotCQl9Ci0KLQkJZHN0X3N0YXRlX3VubG9jayhzdCk7Ci0KLQkJaWYgKCFuLT50cmFuc19zY2FuX3RpbWVvdXQpCi0JCQllcnIgPSAtRU5PREVWOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBTZW5kIGJsb2NrIGF1dG9jb25mIHJlcGx5LgotICovCi1zdGF0aWMgaW50IGRzdF9wcm9jZXNzX2NmZyhzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSBzdC0+bm9kZTsKLQlzdHJ1Y3QgZHN0X2NtZCAqY21kID0gc3QtPmRhdGE7Ci0JaW50IGVycjsKLQotCWNtZC0+c2VjdG9yID0gbi0+c2l6ZTsKLQljbWQtPnJ3ID0gc3QtPnBlcm1pc3Npb25zOwotCi0JZHN0X2NvbnZlcnRfY21kKGNtZCk7Ci0KLQlkc3Rfc3RhdGVfbG9jayhzdCk7Ci0JZXJyID0gZHN0X2RhdGFfc2VuZF9oZWFkZXIoc3QtPnNvY2tldCwgY21kLCBzaXplb2Yoc3RydWN0IGRzdF9jbWQpLCAwKTsKLQlkc3Rfc3RhdGVfdW5sb2NrKHN0KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBSZWNlaXZlIGJsb2NrIElPIGZyb20gdGhlIG5ldHdvcmsuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X3JlY3ZfYmlvKHN0cnVjdCBkc3Rfc3RhdGUgKnN0LCBzdHJ1Y3QgYmlvICpiaW8sCi0JCXVuc2lnbmVkIGludCB0b3RhbF9zaXplKQotewotCXN0cnVjdCBiaW9fdmVjICpidjsKLQlpbnQgaSwgZXJyOwotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgaW50IHN6OwotCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaSkgewotCQlzeiA9IG1pbih0b3RhbF9zaXplLCBidi0+YnZfbGVuKTsKLQotCQlkcHJpbnRrKCIlczogYmlvOiAlbGx1LyV1LCB0b3RhbDogJXUsIGxlbjogJXUsIHN6OiAldSwgIgotCQkJCSJvZmY6ICV1LlxuIiwgX19mdW5jX18sICh1NjQpYmlvLT5iaV9zZWN0b3IsCi0JCQkJYmlvLT5iaV9zaXplLCB0b3RhbF9zaXplLCBidi0+YnZfbGVuLCBzeiwKLQkJCQlidi0+YnZfb2Zmc2V0KTsKLQotCQlkYXRhID0ga21hcChidi0+YnZfcGFnZSkgKyBidi0+YnZfb2Zmc2V0OwotCQllcnIgPSBkc3RfZGF0YV9yZWN2KHN0LCBkYXRhLCBzeik7Ci0JCWt1bm1hcChidi0+YnZfcGFnZSk7Ci0KLQkJYnYtPmJ2X2xlbiA9IHN6OwotCi0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCXRvdGFsX3NpemUgLT0gc3o7Ci0JCWlmICh0b3RhbF9zaXplID09IDApCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIE91ciBibG9jayBJTyBoYXMganVzdCBjb21wbGV0ZWQgYW5kIGFycml2ZWQ6IGdldCBpdC4KLSAqLwotc3RhdGljIGludCBkc3RfcHJvY2Vzc19pb19yZXNwb25zZShzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSBzdC0+bm9kZTsKLQlzdHJ1Y3QgZHN0X2NtZCAqY21kID0gc3QtPmRhdGE7Ci0Jc3RydWN0IGRzdF90cmFucyAqdDsKLQlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgYmlvICpiaW87Ci0KLQltdXRleF9sb2NrKCZuLT50cmFuc19sb2NrKTsKLQl0ID0gZHN0X3RyYW5zX3NlYXJjaChuLCBjbWQtPmlkKTsKLQltdXRleF91bmxvY2soJm4tPnRyYW5zX2xvY2spOwotCi0JaWYgKCF0KQotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCWJpbyA9IHQtPmJpbzsKLQotCWRwcmludGsoIiVzOiBiaW86ICVsbHUvJXUsIGNtZF9zaXplOiAldSwgY3NpemU6ICV1LCBkaXI6ICVsdS5cbiIsCi0JCV9fZnVuY19fLCAodTY0KWJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUsIGNtZC0+c2l6ZSwKLQkJY21kLT5jc2l6ZSwgYmlvX2RhdGFfZGlyKGJpbykpOwotCi0JaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpIHsKLQkJaWYgKGJpby0+Ymlfc2l6ZSAhPSBjbWQtPnNpemUgLSBjbWQtPmNzaXplKQotCQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0KLQkJaWYgKGRzdF9uZWVkX2NyeXB0byhuKSkgewotCQkJZXJyID0gZHN0X3JlY3ZfY2RhdGEoc3QsIHQtPmNtZC5oYXNoKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0JCX0KLQotCQllcnIgPSBkc3RfcmVjdl9iaW8oc3QsIHQtPmJpbywgYmlvLT5iaV9zaXplKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dF9leGl0OwotCi0JCWlmIChkc3RfbmVlZF9jcnlwdG8obikpCi0JCQlyZXR1cm4gZHN0X3RyYW5zX2NyeXB0byh0KTsKLQl9IGVsc2UgewotCQllcnIgPSAtRUJBRE1TRzsKLQkJaWYgKGNtZC0+c2l6ZSB8fCBjbWQtPmNzaXplKQotCQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0JfQotCi0JZHN0X3RyYW5zX3JlbW92ZSh0KTsKLQlkc3RfdHJhbnNfcHV0KHQpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogUmVjZWl2ZSBjcnlwdG8gZGF0YS4KLSAqLwotaW50IGRzdF9yZWN2X2NkYXRhKHN0cnVjdCBkc3Rfc3RhdGUgKnN0LCB2b2lkICpjZGF0YSkKLXsKLQlzdHJ1Y3QgZHN0X2NtZCAqY21kID0gc3QtPmRhdGE7Ci0Jc3RydWN0IGRzdF9ub2RlICpuID0gc3QtPm5vZGU7Ci0Jc3RydWN0IGRzdF9jcnlwdG9fY3RsICpjID0gJm4tPmNyeXB0bzsKLQlpbnQgZXJyOwotCi0JaWYgKGNtZC0+Y3NpemUgIT0gYy0+Y3J5cHRvX2F0dGFjaGVkX3NpemUpIHsKLQkJZHByaW50aygiJXM6IGNtZDogY21kOiAldSwgc2VjdG9yOiAlbGx1LCBzaXplOiAldSwgIgotCQkJCSJjc2l6ZTogJXUgIT0gZGlnZXN0IHNpemUgJXUuXG4iLAotCQkJCV9fZnVuY19fLCBjbWQtPmNtZCwgY21kLT5zZWN0b3IsIGNtZC0+c2l6ZSwKLQkJCQljbWQtPmNzaXplLCBjLT5jcnlwdG9fYXR0YWNoZWRfc2l6ZSk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX291dF9leGl0OwotCX0KLQotCWVyciA9IGRzdF9kYXRhX3JlY3Yoc3QsIGNkYXRhLCBjbWQtPmNzaXplKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCWNtZC0+c2l6ZSAtPSBjbWQtPmNzaXplOwotCXJldHVybiAwOwotCi1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIFJlY2VpdmUgdGhlIGNvbW1hbmQgYW5kIHN0YXJ0IGl0cyBwcm9jZXNzaW5nLgotICovCi1zdGF0aWMgaW50IGRzdF9yZWN2X3Byb2Nlc3Npbmcoc3RydWN0IGRzdF9zdGF0ZSAqc3QpCi17Ci0JaW50IGVyciA9IC1FSU5UUjsKLQlzdHJ1Y3QgZHN0X2NtZCAqY21kID0gc3QtPmRhdGE7Ci0KLQkvKgotCSAqIElmIHNvY2tldCB3aWxsIGJlIHJlc2V0IGFmdGVyIHRoaXMgc3RhdGVtZW50LCB0aGVuCi0JICogZHN0X2RhdGFfcmVjdigpIHdpbGwganVzdCBmYWlsIGFuZCBsb29wIHdpbGwKLQkgKiBzdGFydCBhZ2Fpbiwgc28gaXQgY2FuIGJlIGRvbmUgd2l0aG91dCBhbnkgbG9ja3MuCi0JICoKLQkgKiBzdC0+cmVhZF9zb2NrZXQgaXMgbmVlZGVkIHRvIHByZXZlbnRzIHN0YXRlIG1hY2hpbmUKLQkgKiBicmVha2luZyBiZXR3ZWVuIHRoaXMgZGF0YSByZWFkaW5nIGFuZCBzdWJzZXF1ZW50IG9uZQotCSAqIGluIHByb3RvY29sIHNwZWNpZmljIGZ1bmN0aW9ucyBkdXJpbmcgY29ubmVjdGlvbiByZXNldC4KLQkgKiBJbiBjYXNlIG9mIHJlc2V0IHdlIGhhdmUgdG8gcmVhZCBuZXh0IGNvbW1hbmQgYW5kIGRvCi0JICogbm90IGV4cGVjdCBkYXRhIGZvciBvbGQgY29tbWFuZCB0byBtYWdpY2FsbHkgYXBwZWFyIGluCi0JICogbmV3IGNvbm5lY3Rpb24uCi0JICovCi0Jc3QtPnJlYWRfc29ja2V0ID0gc3QtPnNvY2tldDsKLQllcnIgPSBkc3RfZGF0YV9yZWN2KHN0LCBjbWQsIHNpemVvZihzdHJ1Y3QgZHN0X2NtZCkpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2V4aXQ7Ci0KLQlkc3RfY29udmVydF9jbWQoY21kKTsKLQotCWRwcmludGsoIiVzOiBjbWQ6ICV1LCBzaXplOiAldSwgY3NpemU6ICV1LCBpZDogJWxsdSwgIgotCQkJInNlY3RvcjogJWxsdSwgZmxhZ3M6ICVsbHgsIHJ3OiAlbGx4LlxuIiwKLQkJCV9fZnVuY19fLCBjbWQtPmNtZCwgY21kLT5zaXplLAotCQkJY21kLT5jc2l6ZSwgY21kLT5pZCwgY21kLT5zZWN0b3IsCi0JCQljbWQtPmZsYWdzLCBjbWQtPnJ3KTsKLQotCS8qCi0JICogVGhpcyBzaG91bGQgY2F0Y2ggcHJvdG9jb2wgYnJlYWthZ2UgYW5kIHJhbmRvbSBnYXJiYWdlCi0JICogaW5zdGVhZCBvZiBjb21tYW5kcy4KLQkgKi8KLQlpZiAodW5saWtlbHkoY21kLT5jc2l6ZSA+IHN0LT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBkc3RfY21kKSkpIHsKLQkJZXJyID0gLUVCQURNU0c7Ci0JCWdvdG8gb3V0X2V4aXQ7Ci0JfQotCi0JZXJyID0gLUVQUk9UTzsKLQlzd2l0Y2ggKGNtZC0+Y21kKSB7Ci0JY2FzZSBEU1RfSU9fUkVTUE9OU0U6Ci0JCWVyciA9IGRzdF9wcm9jZXNzX2lvX3Jlc3BvbnNlKHN0KTsKLQkJYnJlYWs7Ci0JY2FzZSBEU1RfSU86Ci0JCWVyciA9IGRzdF9wcm9jZXNzX2lvKHN0KTsKLQkJYnJlYWs7Ci0JY2FzZSBEU1RfQ0ZHOgotCQllcnIgPSBkc3RfcHJvY2Vzc19jZmcoc3QpOwotCQlicmVhazsKLQljYXNlIERTVF9QSU5HOgotCQllcnIgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLW91dF9leGl0OgotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBSZWNlaXZpbmcgdGhyZWFkLiBGb3IgdGhlIGNsaWVudCBub2RlIHdlIHNob3VsZCB0cnkgdG8gcmVjb25uZWN0LAotICogZm9yIGFjY2VwdGVkIGNsaWVudCB3ZSBqdXN0IGRyb3AgdGhlIHN0YXRlIGFuZCBleHBlY3QgaXQgdG8gcmVjb25uZWN0LgotICovCi1zdGF0aWMgaW50IGRzdF9yZWN2KHZvaWQgKmluaXRfZGF0YSwgdm9pZCAqc2NoZWR1bGVfZGF0YSkKLXsKLQlzdHJ1Y3QgZHN0X3N0YXRlICpzdCA9IHNjaGVkdWxlX2RhdGE7Ci0Jc3RydWN0IGRzdF9ub2RlICpuID0gaW5pdF9kYXRhOwotCWludCBlcnIgPSAwOwotCi0JZHByaW50aygiJXM6IHN0YXJ0IHN0OiAlcCwgbjogJXAsIHNjYW46ICVsdSwgbmVlZF9leGl0OiAlZC5cbiIsCi0JCQlfX2Z1bmNfXywgc3QsIG4sIG4tPnRyYW5zX3NjYW5fdGltZW91dCwgc3QtPm5lZWRfZXhpdCk7Ci0KLQl3aGlsZSAobi0+dHJhbnNfc2Nhbl90aW1lb3V0ICYmICFzdC0+bmVlZF9leGl0KSB7Ci0JCWVyciA9IGRzdF9yZWN2X3Byb2Nlc3Npbmcoc3QpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJaWYgKCFzdC0+Y3RsLnR5cGUpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmICghbi0+dHJhbnNfc2Nhbl90aW1lb3V0IHx8IHN0LT5uZWVkX2V4aXQpCi0JCQkJYnJlYWs7Ci0KLQkJCWRzdF9zdGF0ZV9yZXNldChzdCk7Ci0JCQltc2xlZXAoMTAwMCk7Ci0JCX0KLQl9Ci0KLQlzdC0+bmVlZF9leGl0ID0gMTsKLQl3YWtlX3VwKCZzdC0+dGhyZWFkX3dhaXQpOwotCi0JZHByaW50aygiJXM6IGZyZWVpbmcgcmVjZWl2aW5nIHNvY2tldCBzdDogJXAuXG4iLCBfX2Z1bmNfXywgc3QpOwotCWRzdF9zdGF0ZV9sb2NrKHN0KTsKLQlkc3Rfc3RhdGVfZXhpdF9jb25uZWN0ZWQoc3QpOwotCWRzdF9zdGF0ZV91bmxvY2soc3QpOwotCWRzdF9zdGF0ZV9wdXQoc3QpOwotCi0JZHByaW50aygiJXM6IGZyZWVkIHJlY2VpdmluZyBzb2NrZXQgc3Q6ICVwLlxuIiwgX19mdW5jX18sIHN0KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBOZXR3b3JrIHN0YXRlIGRpZXMgaGVyZSBhbmQgYm9ybnMgY291cGxlIG9mIGxpbmVzIGJlbG93LgotICogVGhpcyBvYmplY3QgaXMgdGhlIG1haW4gbmV0d29yayBzdGF0ZSBwcm9jZXNzaW5nIGVuZ2luZToKLSAqIHNlbmRpbmcsIHJlY2VpdmluZywgcmVjb25uZWN0aW9ucywgYWxsIG5ldHdvcmsgcmVsYXRlZAotICogdGFza3MgYXJlIGhhbmRsZWQgb24gYmVoYWxmIG9mIHRoZSBzdGF0ZS4KLSAqLwotc3RhdGljIHZvaWQgZHN0X3N0YXRlX2ZyZWUoc3RydWN0IGRzdF9zdGF0ZSAqc3QpCi17Ci0JZHByaW50aygiJXM6IHN0OiAlcC5cbiIsIF9fZnVuY19fLCBzdCk7Ci0JaWYgKHN0LT5jbGVhbnVwKQotCQlzdC0+Y2xlYW51cChzdCk7Ci0Ja2ZyZWUoc3QtPmRhdGEpOwotCWtmcmVlKHN0KTsKLX0KLQotc3RydWN0IGRzdF9zdGF0ZSAqZHN0X3N0YXRlX2FsbG9jKHN0cnVjdCBkc3Rfbm9kZSAqbikKLXsKLQlzdHJ1Y3QgZHN0X3N0YXRlICpzdDsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzdF9zdGF0ZSksIEdGUF9LRVJORUwpOwotCWlmICghc3QpCi0JCWdvdG8gZXJyX291dF9leGl0OwotCi0Jc3QtPm5vZGUgPSBuOwotCXN0LT5uZWVkX2V4aXQgPSAwOwotCi0Jc3QtPnNpemUgPSBQQUdFX1NJWkU7Ci0Jc3QtPmRhdGEgPSBrbWFsbG9jKHN0LT5zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0LT5kYXRhKQotCQlnb3RvIGVycl9vdXRfZnJlZTsKLQotCXNwaW5fbG9ja19pbml0KCZzdC0+cmVxdWVzdF9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmc3QtPnJlcXVlc3RfbGlzdCk7Ci0KLQltdXRleF9pbml0KCZzdC0+c3RhdGVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmc3QtPnRocmVhZF93YWl0KTsKLQotCS8qCi0JICogT25lIGZvciBwcm9jZXNzaW5nIHRocmVhZCwgYW5vdGhlciBvbmUgZm9yIG5vZGUgaXRzZWxmLgotCSAqLwotCWF0b21pY19zZXQoJnN0LT5yZWZjbnQsIDIpOwotCi0JZHByaW50aygiJXM6IHN0OiAlcCwgbjogJXAuXG4iLCBfX2Z1bmNfXywgc3QsIHN0LT5ub2RlKTsKLQotCXJldHVybiBzdDsKLQotZXJyX291dF9mcmVlOgotCWtmcmVlKHN0KTsKLWVycl9vdXRfZXhpdDoKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi1pbnQgZHN0X3N0YXRlX3NjaGVkdWxlX3JlY2VpdmVyKHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQotewotCXJldHVybiB0aHJlYWRfcG9vbF9zY2hlZHVsZV9wcml2YXRlKHN0LT5ub2RlLT5wb29sLCBkc3RfdGhyZWFkX3NldHVwLAotCQkJZHN0X3JlY3YsIHN0LCBNQVhfU0NIRURVTEVfVElNRU9VVCwgc3QtPm5vZGUpOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBjbGllbnQncyBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgcGVlcjogYWxsb2NhdGUgc3RhdGUsCi0gKiBjb25uZWN0IGFuZCBwZXJmb3JtIGJsb2NrIElPIGF1dG9jb25maWd1cmF0aW9uLgotICovCi1pbnQgZHN0X25vZGVfaW5pdF9jb25uZWN0ZWQoc3RydWN0IGRzdF9ub2RlICpuLCBzdHJ1Y3QgZHN0X25ldHdvcmtfY3RsICpyKQotewotCXN0cnVjdCBkc3Rfc3RhdGUgKnN0OwotCWludCBlcnIgPSAtRU5PTUVNOwotCi0Jc3QgPSBkc3Rfc3RhdGVfYWxsb2Mobik7Ci0JaWYgKElTX0VSUihzdCkpIHsKLQkJZXJyID0gUFRSX0VSUihzdCk7Ci0JCWdvdG8gZXJyX291dF9leGl0OwotCX0KLQltZW1jcHkoJnN0LT5jdGwsIHIsIHNpemVvZihzdHJ1Y3QgZHN0X25ldHdvcmtfY3RsKSk7Ci0KLQllcnIgPSBkc3Rfc3RhdGVfaW5pdF9jb25uZWN0ZWQoc3QpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF9mcmVlX2RhdGE7Ci0KLQllcnIgPSBkc3RfcmVxdWVzdF9yZW1vdGVfY29uZmlnKHN0KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfZXhpdF9jb25uZWN0ZWQ7Ci0Jbi0+c3RhdGUgPSBzdDsKLQotCWVyciA9IGRzdF9zdGF0ZV9zY2hlZHVsZV9yZWNlaXZlcihzdCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X2V4aXRfY29ubmVjdGVkOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZXhpdF9jb25uZWN0ZWQ6Ci0JZHN0X3N0YXRlX2V4aXRfY29ubmVjdGVkKHN0KTsKLWVycl9vdXRfZnJlZV9kYXRhOgotCWRzdF9zdGF0ZV9mcmVlKHN0KTsKLWVycl9vdXRfZXhpdDoKLQluLT5zdGF0ZSA9IE5VTEw7Ci0JcmV0dXJuIGVycjsKLX0KLQotdm9pZCBkc3Rfc3RhdGVfcHV0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQotewotCWRwcmludGsoIiVzOiBzdDogJXAsIHJlZmNudDogJWQuXG4iLAotCQkJX19mdW5jX18sIHN0LCBhdG9taWNfcmVhZCgmc3QtPnJlZmNudCkpOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzdC0+cmVmY250KSkKLQkJZHN0X3N0YXRlX2ZyZWUoc3QpOwotfQotCi0vKgotICogU2VuZCBibG9jayBJTyB0byB0aGUgbmV0d29yayBvbmUgYnkgb25lIHVzaW5nIHplcm8tY29weSAtPnNlbmRwYWdlKCkuCi0gKi8KLWludCBkc3Rfc2VuZF9iaW8oc3RydWN0IGRzdF9zdGF0ZSAqc3QsIHN0cnVjdCBkc3RfY21kICpjbWQsIHN0cnVjdCBiaW8gKmJpbykKLXsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0Jc3RydWN0IGRzdF9jcnlwdG9fY3RsICpjID0gJnN0LT5ub2RlLT5jcnlwdG87Ci0JaW50IGVyciwgaSA9IDA7Ci0JaW50IGZsYWdzID0gTVNHX1dBSVRBTEw7Ci0KLQllcnIgPSBkc3RfZGF0YV9zZW5kX2hlYWRlcihzdC0+c29ja2V0LCBjbWQsCi0JCXNpemVvZihzdHJ1Y3QgZHN0X2NtZCkgKyBjLT5jcnlwdG9fYXR0YWNoZWRfc2l6ZSwgYmlvLT5iaV92Y250KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGkpIHsKLQkJaWYgKGkgPCBiaW8tPmJpX3ZjbnQgLSAxKQotCQkJZmxhZ3MgfD0gTVNHX01PUkU7Ci0KLQkJZXJyID0ga2VybmVsX3NlbmRwYWdlKHN0LT5zb2NrZXQsIGJ2LT5idl9wYWdlLCBidi0+YnZfb2Zmc2V0LAotCQkJCWJ2LT5idl9sZW4sIGZsYWdzKTsKLQkJaWYgKGVyciA8PSAwKQotCQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZXhpdDoKLQlkcHJpbnRrKCIlczogJWQvJWQsIGZsYWdzOiAleCwgZXJyOiAlZC5cbiIsCi0JCQlfX2Z1bmNfXywgaSwgYmlvLT5iaV92Y250LCBmbGFncywgZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogU2VuZCB0cmFuc2FjdGlvbiB0byB0aGUgcmVtb3RlIHBlZXIuCi0gKi8KLWludCBkc3RfdHJhbnNfc2VuZChzdHJ1Y3QgZHN0X3RyYW5zICp0KQotewotCWludCBlcnI7Ci0Jc3RydWN0IGRzdF9zdGF0ZSAqc3QgPSB0LT5uLT5zdGF0ZTsKLQlzdHJ1Y3QgYmlvICpiaW8gPSB0LT5iaW87Ci0KLQlkc3RfY29udmVydF9jbWQoJnQtPmNtZCk7Ci0KLQlkc3Rfc3RhdGVfbG9jayhzdCk7Ci0JaWYgKCFzdC0+c29ja2V0KSB7Ci0JCWVyciA9IGRzdF9zdGF0ZV9pbml0X2Nvbm5lY3RlZChzdCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXRfdW5sb2NrOwotCX0KLQotCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgewotCQllcnIgPSBkc3Rfc2VuZF9iaW8oc3QsICZ0LT5jbWQsIHQtPmJpbyk7Ci0JfSBlbHNlIHsKLQkJZXJyID0gZHN0X2RhdGFfc2VuZF9oZWFkZXIoc3QtPnNvY2tldCwgJnQtPmNtZCwKLQkJCQlzaXplb2Yoc3RydWN0IGRzdF9jbWQpLCAwKTsKLQl9Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X3Jlc2V0OwotCi0JZHN0X3N0YXRlX3VubG9jayhzdCk7Ci0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfcmVzZXQ6Ci0JZHN0X3N0YXRlX3Jlc2V0X25vbG9jayhzdCk7Ci1lcnJfb3V0X3VubG9jazoKLQlkc3Rfc3RhdGVfdW5sb2NrKHN0KTsKLQotCXJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHN0L3RocmVhZF9wb29sLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L3RocmVhZF9wb29sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTgyYjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC90aHJlYWRfcG9vbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qCi0gKiAyMDA3KyBDb3B5cmlnaHQgKGMpIEV2Z2VuaXkgUG9seWFrb3YgPHpickBpb3JlbWFwLm5ldD4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0vKgotICogVGhyZWFkIHBvb2wgYWJzdHJhY3Rpb24gYWxsb3dzIHRvIHNjaGVkdWxlIGEgd29yayB0byBiZSBwZXJmb3JtZWQKLSAqIG9uIGJlaGFsZiBvZiBrZXJuZWwgdGhyZWFkLiBPbmUgZG9lcyBub3Qgb3BlcmF0ZSB3aXRoIHRocmVhZHMgaXRzZWxmLAotICogaW5zdGVhZCB1c2VyIHByb3ZpZGVzIHNldHVwIGFuZCBjbGVhbnVwIGNhbGxiYWNrcyBmb3IgdGhyZWFkIHBvb2wgaXRzZWxmLAotICogYW5kIGFjdGlvbiBhbmQgY2xlYW51cCBjYWxsYmFja3MgZm9yIGVhY2ggc3VibWl0dGVkIHdvcmsuCi0gKgotICogRWFjaCB3b3JrZXIgaGFzIHByaXZhdGUgZGF0YSBpbml0aWFsaXplZCBhdCBjcmVhdGlvbiB0aW1lIGFuZCBkYXRhLAotICogcHJvdmlkZWQgYnkgdXNlciBhdCBzY2hlZHVsaW5nIHRpbWUuCi0gKgotICogV2hlbiBhY3Rpb24gaXMgYmVpbmcgcGVyZm9ybWVkLCB0aHJlYWQgY2FuIG5vdCBiZSB1c2VkIGJ5IG90aGVyIHVzZXJzLAotICogaW5zdGVhZCB0aGV5IHdpbGwgc2xlZXAgdW50aWwgdGhlcmUgaXMgZnJlZSB0aHJlYWQgdG8gcGljayB0aGVpciB3b3JrLgotICovCi1zdHJ1Y3QgdGhyZWFkX3Bvb2xfd29ya2VyIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXdvcmtlcl9lbnRyeTsKLQotCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGhyZWFkOwotCi0Jc3RydWN0IHRocmVhZF9wb29sCSpwb29sOwotCi0JaW50CQkJZXJyb3I7Ci0JaW50CQkJaGFzX2RhdGE7Ci0JaW50CQkJbmVlZF9leGl0OwotCXVuc2lnbmVkIGludAkJaWQ7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwotCi0Jdm9pZAkJCSpwcml2YXRlOwotCXZvaWQJCQkqc2NoZWR1bGVfZGF0YTsKLQotCWludAkJCSgqYWN0aW9uKSh2b2lkICpwcml2YXRlLCB2b2lkICpzY2hlZHVsZV9kYXRhKTsKLQl2b2lkCQkJKCpjbGVhbnVwKSh2b2lkICpwcml2YXRlKTsKLX07Ci0KLXN0YXRpYyB2b2lkIHRocmVhZF9wb29sX2V4aXRfd29ya2VyKHN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgKncpCi17Ci0Ja3RocmVhZF9zdG9wKHctPnRocmVhZCk7Ci0KLQl3LT5jbGVhbnVwKHctPnByaXZhdGUpOwotCWtmcmVlKHcpOwotfQotCi0vKgotICogQ2FsbGVkIHRvIG1hcmsgdGhyZWFkIGFzIHJlYWR5IGFuZCBhbGxvdyB1c2VycyB0byBzY2hlZHVsZSBuZXcgd29yay4KLSAqLwotc3RhdGljIHZvaWQgdGhyZWFkX3Bvb2xfd29ya2VyX21ha2VfcmVhZHkoc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdykKLXsKLQlzdHJ1Y3QgdGhyZWFkX3Bvb2wgKnAgPSB3LT5wb29sOwotCi0JbXV0ZXhfbG9jaygmcC0+dGhyZWFkX2xvY2spOwotCi0JaWYgKCF3LT5uZWVkX2V4aXQpIHsKLQkJbGlzdF9tb3ZlX3RhaWwoJnctPndvcmtlcl9lbnRyeSwgJnAtPnJlYWR5X2xpc3QpOwotCQl3LT5oYXNfZGF0YSA9IDA7Ci0JCW11dGV4X3VubG9jaygmcC0+dGhyZWFkX2xvY2spOwotCi0JCXdha2VfdXAoJnAtPndhaXQpOwotCX0gZWxzZSB7Ci0JCXAtPnRocmVhZF9udW0tLTsKLQkJbGlzdF9kZWwoJnctPndvcmtlcl9lbnRyeSk7Ci0JCW11dGV4X3VubG9jaygmcC0+dGhyZWFkX2xvY2spOwotCi0JCXRocmVhZF9wb29sX2V4aXRfd29ya2VyKHcpOwotCX0KLX0KLQotLyoKLSAqIFRocmVhZCBhY3Rpb24gbG9vcDogd2FpdHMgdW50aWwgdGhlcmUgaXMgbmV3IHdvcmsuCi0gKi8KLXN0YXRpYyBpbnQgdGhyZWFkX3Bvb2xfd29ya2VyX2Z1bmModm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgdGhyZWFkX3Bvb2xfd29ya2VyICp3ID0gZGF0YTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh3LT53YWl0LAotCQkJa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IHctPmhhc19kYXRhKTsKLQotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJYnJlYWs7Ci0KLQkJaWYgKCF3LT5oYXNfZGF0YSkKLQkJCWNvbnRpbnVlOwotCi0JCXctPmFjdGlvbih3LT5wcml2YXRlLCB3LT5zY2hlZHVsZV9kYXRhKTsKLQkJdGhyZWFkX3Bvb2xfd29ya2VyX21ha2VfcmVhZHkodyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBSZW1vdmUgc2luZ2xlIHdvcmtlciB3aXRob3V0IHNwZWNpZnlpbmcgd2hpY2ggb25lLgotICovCi12b2lkIHRocmVhZF9wb29sX2RlbF93b3JrZXIoc3RydWN0IHRocmVhZF9wb29sICpwKQotewotCXN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgKncgPSBOVUxMOwotCi0Jd2hpbGUgKCF3ICYmIHAtPnRocmVhZF9udW0pIHsKLQkJd2FpdF9ldmVudChwLT53YWl0LCAhbGlzdF9lbXB0eSgmcC0+cmVhZHlfbGlzdCkgfHwKLQkJCQkhcC0+dGhyZWFkX251bSk7Ci0KLQkJZHByaW50aygiJXM6IGxvY2tpbmcgbGlzdF9lbXB0eTogJWQsIHRocmVhZF9udW06ICVkLlxuIiwKLQkJCQlfX2Z1bmNfXywgbGlzdF9lbXB0eSgmcC0+cmVhZHlfbGlzdCksCi0JCQkJcC0+dGhyZWFkX251bSk7Ci0KLQkJbXV0ZXhfbG9jaygmcC0+dGhyZWFkX2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJnAtPnJlYWR5X2xpc3QpKSB7Ci0JCQl3ID0gbGlzdF9maXJzdF9lbnRyeSgmcC0+cmVhZHlfbGlzdCwKLQkJCQkJc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciwKLQkJCQkJd29ya2VyX2VudHJ5KTsKLQotCQkJZHByaW50aygiJXM6IGRlbGV0aW5nIHc6ICVwLCB0aHJlYWRfbnVtOiAlZCwgIgotCQkJCQkibGlzdDogJXAgWyVwLiVwXS5cbiIsIF9fZnVuY19fLAotCQkJCQl3LCBwLT50aHJlYWRfbnVtLCAmcC0+cmVhZHlfbGlzdCwKLQkJCQkJcC0+cmVhZHlfbGlzdC5wcmV2LCBwLT5yZWFkeV9saXN0Lm5leHQpOwotCi0JCQlwLT50aHJlYWRfbnVtLS07Ci0JCQlsaXN0X2RlbCgmdy0+d29ya2VyX2VudHJ5KTsKLQkJfQotCQltdXRleF91bmxvY2soJnAtPnRocmVhZF9sb2NrKTsKLQl9Ci0KLQlpZiAodykKLQkJdGhyZWFkX3Bvb2xfZXhpdF93b3JrZXIodyk7Ci0JZHByaW50aygiJXM6IGRlbGV0ZWQgdzogJXAsIHRocmVhZF9udW06ICVkLlxuIiwKLQkJCV9fZnVuY19fLCB3LCBwLT50aHJlYWRfbnVtKTsKLX0KLQotLyoKLSAqIFJlbW92ZSBhIHdvcmtlciB3aXRoIGdpdmVuIElELgotICovCi12b2lkIHRocmVhZF9wb29sX2RlbF93b3JrZXJfaWQoc3RydWN0IHRocmVhZF9wb29sICpwLCB1bnNpZ25lZCBpbnQgaWQpCi17Ci0Jc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdzsKLQlpbnQgZm91bmQgPSAwOwotCi0JbXV0ZXhfbG9jaygmcC0+dGhyZWFkX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnAtPnJlYWR5X2xpc3QsIHdvcmtlcl9lbnRyeSkgewotCQlpZiAody0+aWQgPT0gaWQpIHsKLQkJCWZvdW5kID0gMTsKLQkJCXAtPnRocmVhZF9udW0tLTsKLQkJCWxpc3RfZGVsKCZ3LT53b3JrZXJfZW50cnkpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIWZvdW5kKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnAtPmFjdGl2ZV9saXN0LCB3b3JrZXJfZW50cnkpIHsKLQkJCWlmICh3LT5pZCA9PSBpZCkgewotCQkJCXctPm5lZWRfZXhpdCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwLT50aHJlYWRfbG9jayk7Ci0KLQlpZiAoZm91bmQpCi0JCXRocmVhZF9wb29sX2V4aXRfd29ya2VyKHcpOwotfQotCi0vKgotICogQWRkIG5ldyB3b3JrZXIgdGhyZWFkIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy4KLSAqIElmIGluaXRpYWxpemF0aW9uIGNhbGxiYWNrIGZhaWxzLCByZXR1cm4gZXJyb3IuCi0gKi8KLWludCB0aHJlYWRfcG9vbF9hZGRfd29ya2VyKHN0cnVjdCB0aHJlYWRfcG9vbCAqcCwKLQkJY2hhciAqbmFtZSwKLQkJdW5zaWduZWQgaW50IGlkLAotCQl2b2lkICooKmluaXQpKHZvaWQgKnByaXZhdGUpLAotCQl2b2lkICgqY2xlYW51cCkodm9pZCAqcHJpdmF0ZSksCi0JCXZvaWQgKnByaXZhdGUpCi17Ci0Jc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdzsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGhyZWFkX3Bvb2xfd29ya2VyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3KQotCQlnb3RvIGVycl9vdXRfZXhpdDsKLQotCXctPnBvb2wgPSBwOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnctPndhaXQpOwotCXctPmNsZWFudXAgPSBjbGVhbnVwOwotCXctPmlkID0gaWQ7Ci0KLQl3LT50aHJlYWQgPSBrdGhyZWFkX3J1bih0aHJlYWRfcG9vbF93b3JrZXJfZnVuYywgdywgIiVzIiwgbmFtZSk7Ci0JaWYgKElTX0VSUih3LT50aHJlYWQpKSB7Ci0JCWVyciA9IFBUUl9FUlIody0+dGhyZWFkKTsKLQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0JfQotCi0Jdy0+cHJpdmF0ZSA9IGluaXQocHJpdmF0ZSk7Ci0JaWYgKElTX0VSUih3LT5wcml2YXRlKSkgewotCQllcnIgPSBQVFJfRVJSKHctPnByaXZhdGUpOwotCQlnb3RvIGVycl9vdXRfc3RvcF90aHJlYWQ7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcC0+dGhyZWFkX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJnctPndvcmtlcl9lbnRyeSwgJnAtPnJlYWR5X2xpc3QpOwotCXAtPnRocmVhZF9udW0rKzsKLQltdXRleF91bmxvY2soJnAtPnRocmVhZF9sb2NrKTsKLQotCXJldHVybiAwOwotCi1lcnJfb3V0X3N0b3BfdGhyZWFkOgotCWt0aHJlYWRfc3RvcCh3LT50aHJlYWQpOwotZXJyX291dF9mcmVlOgotCWtmcmVlKHcpOwotZXJyX291dF9leGl0OgotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBEZXN0cm95IHRoZSB3aG9sZSBwb29sLgotICovCi12b2lkIHRocmVhZF9wb29sX2Rlc3Ryb3koc3RydWN0IHRocmVhZF9wb29sICpwKQotewotCXdoaWxlIChwLT50aHJlYWRfbnVtKSB7Ci0JCWRwcmludGsoIiVzOiBudW06ICVkLlxuIiwgX19mdW5jX18sIHAtPnRocmVhZF9udW0pOwotCQl0aHJlYWRfcG9vbF9kZWxfd29ya2VyKHApOwotCX0KLQotCWtmcmVlKHApOwotfQotCi0vKgotICogQ3JlYXRlIGEgcG9vbCB3aXRoIGdpdmVuIG51bWJlciBvZiB0aHJlYWRzLgotICogVGhleSB3aWxsIGhhdmUgc2VxdWVudGlhbCBJRHMgc3RhcnRlZCBmcm9tIHplcm8uCi0gKi8KLXN0cnVjdCB0aHJlYWRfcG9vbCAqdGhyZWFkX3Bvb2xfY3JlYXRlKGludCBudW0sIGNoYXIgKm5hbWUsCi0JCXZvaWQgKigqaW5pdCkodm9pZCAqcHJpdmF0ZSksCi0JCXZvaWQgKCpjbGVhbnVwKSh2b2lkICpwcml2YXRlKSwKLQkJdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgdGhyZWFkX3Bvb2xfd29ya2VyICp3LCAqdG1wOwotCXN0cnVjdCB0aHJlYWRfcG9vbCAqcDsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQlpbnQgaTsKLQotCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGhyZWFkX3Bvb2wpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXApCi0JCWdvdG8gZXJyX291dF9leGl0OwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmcC0+d2FpdCk7Ci0JbXV0ZXhfaW5pdCgmcC0+dGhyZWFkX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZwLT5yZWFkeV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcC0+YWN0aXZlX2xpc3QpOwotCXAtPnRocmVhZF9udW0gPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7Ci0JCWVyciA9IHRocmVhZF9wb29sX2FkZF93b3JrZXIocCwgbmFtZSwgaSwgaW5pdCwKLQkJCQljbGVhbnVwLCBwcml2YXRlKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dF9mcmVlX2FsbDsKLQl9Ci0KLQlyZXR1cm4gcDsKLQotZXJyX291dF9mcmVlX2FsbDoKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodywgdG1wLCAmcC0+cmVhZHlfbGlzdCwgd29ya2VyX2VudHJ5KSB7Ci0JCWxpc3RfZGVsKCZ3LT53b3JrZXJfZW50cnkpOwotCQl0aHJlYWRfcG9vbF9leGl0X3dvcmtlcih3KTsKLQl9Ci0Ja2ZyZWUocCk7Ci1lcnJfb3V0X2V4aXQ6Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotLyoKLSAqIFNjaGVkdWxlIGV4ZWN1dGlvbiBvZiB0aGUgYWN0aW9uIG9uIGEgZ2l2ZW4gdGhyZWFkLAotICogcHJvdmlkZWQgSUQgcG9pbnRlciBoYXMgdG8gbWF0Y2ggcHJldmlvdXNseSBzdG9yZWQKLSAqIHByaXZhdGUgZGF0YS4KLSAqLwotaW50IHRocmVhZF9wb29sX3NjaGVkdWxlX3ByaXZhdGUoc3RydWN0IHRocmVhZF9wb29sICpwLAotCQlpbnQgKCpzZXR1cCkodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCi0JCWludCAoKmFjdGlvbikodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCi0JCXZvaWQgKmRhdGEsIGxvbmcgdGltZW91dCwgdm9pZCAqaWQpCi17Ci0Jc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdywgKnRtcCwgKndvcmtlciA9IE5VTEw7Ci0JaW50IGVyciA9IDA7Ci0KLQl3aGlsZSAoIXdvcmtlciAmJiAhZXJyKSB7Ci0JCXRpbWVvdXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChwLT53YWl0LAotCQkJCSFsaXN0X2VtcHR5KCZwLT5yZWFkeV9saXN0KSwKLQkJCQl0aW1lb3V0KTsKLQotCQlpZiAoIXRpbWVvdXQpIHsKLQkJCWVyciA9IC1FVElNRURPVVQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXdvcmtlciA9IE5VTEw7Ci0JCW11dGV4X2xvY2soJnAtPnRocmVhZF9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHcsIHRtcCwgJnAtPnJlYWR5X2xpc3QsIHdvcmtlcl9lbnRyeSkgewotCQkJaWYgKGlkICYmIGlkICE9IHctPnByaXZhdGUpCi0JCQkJY29udGludWU7Ci0KLQkJCXdvcmtlciA9IHc7Ci0KLQkJCWxpc3RfbW92ZV90YWlsKCZ3LT53b3JrZXJfZW50cnksICZwLT5hY3RpdmVfbGlzdCk7Ci0KLQkJCWVyciA9IHNldHVwKHctPnByaXZhdGUsIGRhdGEpOwotCQkJaWYgKCFlcnIpIHsKLQkJCQl3LT5zY2hlZHVsZV9kYXRhID0gZGF0YTsKLQkJCQl3LT5hY3Rpb24gPSBhY3Rpb247Ci0JCQkJdy0+aGFzX2RhdGEgPSAxOwotCQkJCXdha2VfdXAoJnctPndhaXQpOwotCQkJfSBlbHNlIHsKLQkJCQlsaXN0X21vdmVfdGFpbCgmdy0+d29ya2VyX2VudHJ5LAotCQkJCQkJJnAtPnJlYWR5X2xpc3QpOwotCQkJfQotCi0JCQlicmVhazsKLQkJfQotCQltdXRleF91bmxvY2soJnAtPnRocmVhZF9sb2NrKTsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogU2NoZWR1bGUgZXhlY3V0aW9uIG9uIGFyYml0cmFyeSB0aHJlYWQgZnJvbSB0aGUgcG9vbC4KLSAqLwotaW50IHRocmVhZF9wb29sX3NjaGVkdWxlKHN0cnVjdCB0aHJlYWRfcG9vbCAqcCwKLQkJaW50ICgqc2V0dXApKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAotCQlpbnQgKCphY3Rpb24pKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAotCQl2b2lkICpkYXRhLCBsb25nIHRpbWVvdXQpCi17Ci0JcmV0dXJuIHRocmVhZF9wb29sX3NjaGVkdWxlX3ByaXZhdGUocCwgc2V0dXAsCi0JCQlhY3Rpb24sIGRhdGEsIHRpbWVvdXQsIE5VTEwpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC90cmFucy5jIGIvZHJpdmVycy9zdGFnaW5nL2RzdC90cmFucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM2YTZiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvdHJhbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotICogMjAwNysgQ29weXJpZ2h0IChjKSBFdmdlbml5IFBvbHlha292IDx6YnJAaW9yZW1hcC5uZXQ+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvYmlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZHN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KLQotLyoKLSAqIFRyYW5zYWN0aW9uIG1lbW9yeSBwb29sIHNpemUuCi0gKi8KLXN0YXRpYyBpbnQgZHN0X21lbXBvb2xfbnVtID0gMzI7Ci1tb2R1bGVfcGFyYW0oZHN0X21lbXBvb2xfbnVtLCBpbnQsIDA2NDQpOwotCi0vKgotICogVHJhbnNhY3Rpb24gdHJlZSBtYW5hZ2VtZW50LgotICovCi1zdGF0aWMgaW5saW5lIGludCBkc3RfdHJhbnNfY21wKGRzdF9nZW5fdCBnZW4sIGRzdF9nZW5fdCBuZXcpCi17Ci0JaWYgKGdlbiA8IG5ldykKLQkJcmV0dXJuIDE7Ci0JaWYgKGdlbiA+IG5ldykKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgZHN0X3RyYW5zICpkc3RfdHJhbnNfc2VhcmNoKHN0cnVjdCBkc3Rfbm9kZSAqbm9kZSwgZHN0X2dlbl90IGdlbikKLXsKLQlzdHJ1Y3QgcmJfcm9vdCAqcm9vdCA9ICZub2RlLT50cmFuc19yb290OwotCXN0cnVjdCByYl9ub2RlICpuID0gcm9vdC0+cmJfbm9kZTsKLQlzdHJ1Y3QgZHN0X3RyYW5zICp0LCAqcmV0ID0gTlVMTDsKLQlpbnQgY21wOwotCi0Jd2hpbGUgKG4pIHsKLQkJdCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBkc3RfdHJhbnMsIHRyYW5zX2VudHJ5KTsKLQotCQljbXAgPSBkc3RfdHJhbnNfY21wKHQtPmdlbiwgZ2VuKTsKLQkJaWYgKGNtcCA8IDApCi0JCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoY21wID4gMCkKLQkJCW4gPSBuLT5yYl9yaWdodDsKLQkJZWxzZSB7Ci0JCQlyZXQgPSB0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlkcHJpbnRrKCIlczogJXMgdHJhbnNhY3Rpb246IGlkOiAlbGx1LlxuIiwgX19mdW5jX18sCi0JCQkocmV0KSA/ICJmb3VuZCIgOiAibm90IGZvdW5kIiwgZ2VuKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZHN0X3RyYW5zX2luc2VydChzdHJ1Y3QgZHN0X3RyYW5zICpuZXcpCi17Ci0Jc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmbmV3LT5uLT50cmFuc19yb290OwotCXN0cnVjdCByYl9ub2RlICoqbiA9ICZyb290LT5yYl9ub2RlLCAqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgZHN0X3RyYW5zICpyZXQgPSBOVUxMLCAqdDsKLQlpbnQgY21wOwotCi0Jd2hpbGUgKCpuKSB7Ci0JCXBhcmVudCA9ICpuOwotCi0JCXQgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBkc3RfdHJhbnMsIHRyYW5zX2VudHJ5KTsKLQotCQljbXAgPSBkc3RfdHJhbnNfY21wKHQtPmdlbiwgbmV3LT5nZW4pOwotCQlpZiAoY21wIDwgMCkKLQkJCW4gPSAmcGFyZW50LT5yYl9sZWZ0OwotCQllbHNlIGlmIChjbXAgPiAwKQotCQkJbiA9ICZwYXJlbnQtPnJiX3JpZ2h0OwotCQllbHNlIHsKLQkJCXJldCA9IHQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCW5ldy0+c2VuZF90aW1lID0gamlmZmllczsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpc3Q6IG9sZDogZ2VuOiAlbGx1LCBiaW86ICVsbHUvJXUsICIKLQkJCSJzZW5kX3RpbWU6ICVsdSwgbmV3OiBnZW46ICVsbHUsIGJpbzogJWxsdS8ldSwgIgotCQkJInNlbmRfdGltZTogJWx1LlxuIiwgX19mdW5jX18sCi0JCQlyZXQtPmdlbiwgKHU2NClyZXQtPmJpby0+Ymlfc2VjdG9yLAotCQkJcmV0LT5iaW8tPmJpX3NpemUsIHJldC0+c2VuZF90aW1lLAotCQkJbmV3LT5nZW4sICh1NjQpbmV3LT5iaW8tPmJpX3NlY3RvciwKLQkJCW5ldy0+YmlvLT5iaV9zaXplLCBuZXctPnNlbmRfdGltZSk7Ci0JCXJldHVybiAtRUVYSVNUOwotCX0KLQotCXJiX2xpbmtfbm9kZSgmbmV3LT50cmFuc19lbnRyeSwgcGFyZW50LCBuKTsKLQlyYl9pbnNlcnRfY29sb3IoJm5ldy0+dHJhbnNfZW50cnksIHJvb3QpOwotCi0JZHByaW50aygiJXM6IGluc2VydGVkOiBnZW46ICVsbHUsIGJpbzogJWxsdS8ldSwgc2VuZF90aW1lOiAlbHUuXG4iLAotCQlfX2Z1bmNfXywgbmV3LT5nZW4sICh1NjQpbmV3LT5iaW8tPmJpX3NlY3RvciwKLQkJbmV3LT5iaW8tPmJpX3NpemUsIG5ldy0+c2VuZF90aW1lKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZHN0X3RyYW5zX3JlbW92ZV9ub2xvY2soc3RydWN0IGRzdF90cmFucyAqdCkKLXsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSB0LT5uOwotCi0JaWYgKHQtPnRyYW5zX2VudHJ5LnJiX3BhcmVudF9jb2xvcikgewotCQlyYl9lcmFzZSgmdC0+dHJhbnNfZW50cnksICZuLT50cmFuc19yb290KTsKLQkJdC0+dHJhbnNfZW50cnkucmJfcGFyZW50X2NvbG9yID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBkc3RfdHJhbnNfcmVtb3ZlKHN0cnVjdCBkc3RfdHJhbnMgKnQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSB0LT5uOwotCi0JbXV0ZXhfbG9jaygmbi0+dHJhbnNfbG9jayk7Ci0JcmV0ID0gZHN0X3RyYW5zX3JlbW92ZV9ub2xvY2sodCk7Ci0JbXV0ZXhfdW5sb2NrKCZuLT50cmFuc19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBXaGVuIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlZCBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgdXNlcnMsCi0gKiB3ZSBjb21wbGV0ZSBhcHByaWF0ZSBibG9jayBJTyByZXF1ZXN0IHdpdGggZ2l2ZW4gZXJyb3Igc3RhdHVzLgotICovCi12b2lkIGRzdF90cmFuc19wdXQoc3RydWN0IGRzdF90cmFucyAqdCkKLXsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdC0+cmVmY250KSkgewotCQlzdHJ1Y3QgYmlvICpiaW8gPSB0LT5iaW87Ci0KLQkJZHByaW50aygiJXM6IGNvbXBsZXRlZCB0OiAlcCwgZ2VuOiAlbGx1LCBiaW86ICVwLlxuIiwKLQkJCQlfX2Z1bmNfXywgdCwgdC0+Z2VuLCBiaW8pOwotCi0JCWJpb19lbmRpbyhiaW8sIHQtPmVycm9yKTsKLQkJYmlvX3B1dChiaW8pOwotCi0JCWRzdF9ub2RlX3B1dCh0LT5uKTsKLQkJbWVtcG9vbF9mcmVlKHQsIHQtPm4tPnRyYW5zX3Bvb2wpOwotCX0KLX0KLQotLyoKLSAqIFByb2Nlc3MgZ2l2ZW4gYmxvY2sgSU8gcmVxdWVzdDogYWxsb2NhdGUgdHJhbnNhY3Rpb24sIGluc2VydCBpdCBpbnRvIHRoZSB0cmVlCi0gKiBhbmQgc2VuZC9zY2hlZHVsZSBjcnlwdG8gcHJvY2Vzc2luZy4KLSAqLwotaW50IGRzdF9wcm9jZXNzX2JpbyhzdHJ1Y3QgZHN0X25vZGUgKm4sIHN0cnVjdCBiaW8gKmJpbykKLXsKLQlzdHJ1Y3QgZHN0X3RyYW5zICp0OwotCWludCBlcnIgPSAtRU5PTUVNOwotCi0JdCA9IG1lbXBvb2xfYWxsb2Mobi0+dHJhbnNfcG9vbCwgR0ZQX05PRlMpOwotCWlmICghdCkKLQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0KLQl0LT5uID0gZHN0X25vZGVfZ2V0KG4pOwotCXQtPmJpbyA9IGJpbzsKLQl0LT5lcnJvciA9IDA7Ci0JdC0+cmV0cmllcyA9IDA7Ci0JYXRvbWljX3NldCgmdC0+cmVmY250LCAxKTsKLQl0LT5nZW4gPSBhdG9taWNfbG9uZ19pbmNfcmV0dXJuKCZuLT5nZW4pOwotCi0JdC0+ZW5jID0gYmlvX2RhdGFfZGlyKGJpbyk7Ci0JZHN0X2Jpb190b19jbWQoYmlvLCAmdC0+Y21kLCBEU1RfSU8sIHQtPmdlbik7Ci0KLQltdXRleF9sb2NrKCZuLT50cmFuc19sb2NrKTsKLQllcnIgPSBkc3RfdHJhbnNfaW5zZXJ0KHQpOwotCW11dGV4X3VubG9jaygmbi0+dHJhbnNfbG9jayk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X2ZyZWU7Ci0KLQlkcHJpbnRrKCIlczogZ2VuOiAlbGx1LCBiaW86ICVsbHUvJXUsIGRpci9lbmM6ICVkLCBuZWVkX2NyeXB0bzogJWQuXG4iLAotCQkJX19mdW5jX18sIHQtPmdlbiwgKHU2NCliaW8tPmJpX3NlY3RvciwKLQkJCWJpby0+Ymlfc2l6ZSwgdC0+ZW5jLCBkc3RfbmVlZF9jcnlwdG8obikpOwotCi0JaWYgKGRzdF9uZWVkX2NyeXB0byhuKSAmJiB0LT5lbmMpCi0JCWRzdF90cmFuc19jcnlwdG8odCk7Ci0JZWxzZQotCQlkc3RfdHJhbnNfc2VuZCh0KTsKLQotCXJldHVybiAwOwotCi1lcnJfb3V0X2ZyZWU6Ci0JZHN0X25vZGVfcHV0KG4pOwotCW1lbXBvb2xfZnJlZSh0LCBuLT50cmFuc19wb29sKTsKLWVycl9vdXRfZXhpdDoKLQliaW9fZW5kaW8oYmlvLCBlcnIpOwotCWJpb19wdXQoYmlvKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogU2NhbiBmb3IgdGltZW91dC9zdGFsZSB0cmFuc2FjdGlvbnMuCi0gKiBFYWNoIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHJlc2VudCBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgZXJyb3IgY29tcGxldGlvbi4KLSAqLwotc3RhdGljIHZvaWQgZHN0X3RyYW5zX3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHN0X25vZGUsCi0JCQl0cmFuc193b3JrLndvcmspOwotCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOwotCXN0cnVjdCBkc3RfdHJhbnMgKnQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbi0+dHJhbnNfc2Nhbl90aW1lb3V0OwotCWludCBudW0gPSAxMCAqIG4tPnRyYW5zX21heF9yZXRyaWVzOwotCi0JbXV0ZXhfbG9jaygmbi0+dHJhbnNfbG9jayk7Ci0KLQlmb3IgKHJiX25vZGUgPSByYl9maXJzdCgmbi0+dHJhbnNfcm9vdCk7IHJiX25vZGU7ICkgewotCQl0ID0gcmJfZW50cnkocmJfbm9kZSwgc3RydWN0IGRzdF90cmFucywgdHJhbnNfZW50cnkpOwotCi0JCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIodC0+c2VuZF90aW1lICsgdGltZW91dCwgamlmZmllcykKLQkJCQkmJiB0LT5yZXRyaWVzID09IDApCi0JCQlicmVhazsKLSNpZiAwCi0JCWRwcmludGsoIiVzOiB0OiAlcCwgZ2VuOiAlbGx1LCBuOiAlcywgcmV0cmllczogJXUsIG1heDogJXUuXG4iLAotCQkJX19mdW5jX18sIHQsIHQtPmdlbiwgbi0+bmFtZSwKLQkJCXQtPnJldHJpZXMsIG4tPnRyYW5zX21heF9yZXRyaWVzKTsKLSNlbmRpZgotCQlpZiAoLS1udW0gPT0gMCkKLQkJCWJyZWFrOwotCi0JCWRzdF90cmFuc19nZXQodCk7Ci0KLQkJcmJfbm9kZSA9IHJiX25leHQocmJfbm9kZSk7Ci0KLQkJaWYgKHRpbWVvdXQgJiYgKCsrdC0+cmV0cmllcyA8IG4tPnRyYW5zX21heF9yZXRyaWVzKSkgewotCQkJZHN0X3RyYW5zX3NlbmQodCk7Ci0JCX0gZWxzZSB7Ci0JCQl0LT5lcnJvciA9IC1FVElNRURPVVQ7Ci0JCQlkc3RfdHJhbnNfcmVtb3ZlX25vbG9jayh0KTsKLQkJCWRzdF90cmFuc19wdXQodCk7Ci0JCX0KLQotCQlkc3RfdHJhbnNfcHV0KHQpOwotCX0KLQotCW11dGV4X3VubG9jaygmbi0+dHJhbnNfbG9jayk7Ci0KLQkvKgotCSAqIElmIG5vIHRpbWVvdXQgc3BlY2lmaWVkIHRoZW4gc3lzdGVtIGlzIGluIHRoZSBtaWRkbGUgb2YgZXhpdGluZwotCSAqIHByb2Nlc3MsIHNvIG5vIG5lZWQgdG8gcmVzY2hlZHVsZSBzY2FubmluZyBwcm9jZXNzIGFnYWluLgotCSAqLwotCWlmICh0aW1lb3V0KSB7Ci0JCWlmICghbnVtKQotCQkJdGltZW91dCA9IEhaOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm4tPnRyYW5zX3dvcmssIHRpbWVvdXQpOwotCX0KLX0KLQotLyoKLSAqIEZsdXNoIGFsbCB0cmFuc2FjdGlvbnMgYW5kIG1hcmsgdGhlbSBhcyB0aW1lZCBvdXQuCi0gKiBEZXN0cm95IHRyYW5zYWN0aW9uIHBvb2xzLgotICovCi12b2lkIGRzdF9ub2RlX3RyYW5zX2V4aXQoc3RydWN0IGRzdF9ub2RlICpuKQotewotCXN0cnVjdCBkc3RfdHJhbnMgKnQ7Ci0Jc3RydWN0IHJiX25vZGUgKnJiX25vZGU7Ci0KLQlpZiAoIW4tPnRyYW5zX2NhY2hlKQotCQlyZXR1cm47Ci0KLQlkcHJpbnRrKCIlczogbjogJXAsIGNhbmNlbGxpbmcgdGhlIHdvcmsuXG4iLCBfX2Z1bmNfXywgbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZuLT50cmFuc193b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCWRwcmludGsoIiVzOiBuOiAlcCwgd29yayBoYXMgYmVlbiBjYW5jZWxsZWQuXG4iLCBfX2Z1bmNfXywgbik7Ci0KLQlmb3IgKHJiX25vZGUgPSByYl9maXJzdCgmbi0+dHJhbnNfcm9vdCk7IHJiX25vZGU7ICkgewotCQl0ID0gcmJfZW50cnkocmJfbm9kZSwgc3RydWN0IGRzdF90cmFucywgdHJhbnNfZW50cnkpOwotCi0JCWRwcmludGsoIiVzOiB0OiAlcCwgZ2VuOiAlbGx1LCBuOiAlcy5cbiIsCi0JCQlfX2Z1bmNfXywgdCwgdC0+Z2VuLCBuLT5uYW1lKTsKLQotCQlyYl9ub2RlID0gcmJfbmV4dChyYl9ub2RlKTsKLQotCQl0LT5lcnJvciA9IC1FVElNRURPVVQ7Ci0JCWRzdF90cmFuc19yZW1vdmVfbm9sb2NrKHQpOwotCQlkc3RfdHJhbnNfcHV0KHQpOwotCX0KLQotCW1lbXBvb2xfZGVzdHJveShuLT50cmFuc19wb29sKTsKLQlrbWVtX2NhY2hlX2Rlc3Ryb3kobi0+dHJhbnNfY2FjaGUpOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0cmFuc2FjdGlvbiBzdG9yYWdlIGZvciBnaXZlbiBub2RlLgotICogVHJhbnNhY3Rpb24gc3RvcmVzIG5vdCBvbmx5IGNvbnRyb2wgaW5mb3JtYXRpb24sCi0gKiBidXQgYWxzbyBuZXR3b3JrIGNvbW1hbmQgYW5kIGNyeXB0byBkYXRhIChpZiBuZWVkZWQpCi0gKiB0byByZWR1Y2UgbnVtYmVyIG9mIGFsbG9jYXRpb25zLiBUaHVzIHRyYW5zYWN0aW9uIHNpemUKLSAqIGRpZmZlcnMgZnJvbSBub2RlIHRvIG5vZGUuCi0gKi8KLWludCBkc3Rfbm9kZV90cmFuc19pbml0KHN0cnVjdCBkc3Rfbm9kZSAqbiwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JLyoKLQkgKiBXZSBuZWVkIHRoaXMsIHNpbmNlIG5vZGUgd2l0aCBnaXZlbiBuYW1lIGNhbiBiZSBkcm9wcGVkIGZyb20gdGhlCi0JICogaGFzaCB0YWJsZSwgYnV0IGJlIHN0aWxsIGFsaXZlLCBzbyBzdWJzZXF1ZW50IGNyZWF0aW9uIG9mIHRoZSBub2RlCi0JICogd2l0aCB0aGUgc2FtZSBuYW1lIG1heSBjb2xsaWRlIHdpdGggZXhpc3RpbmcgY2FjaGUgbmFtZS4KLQkgKi8KLQotCXNucHJpbnRmKG4tPmNhY2hlX25hbWUsIHNpemVvZihuLT5jYWNoZV9uYW1lKSwgIiVzLSVwIiwgbi0+bmFtZSwgbik7Ci0KLQluLT50cmFuc19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKG4tPmNhY2hlX25hbWUsCi0JCQlzaXplICsgbi0+Y3J5cHRvLmNyeXB0b19hdHRhY2hlZF9zaXplLAotCQkJMCwgMCwgTlVMTCk7Ci0JaWYgKCFuLT50cmFuc19jYWNoZSkKLQkJZ290byBlcnJfb3V0X2V4aXQ7Ci0KLQluLT50cmFuc19wb29sID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKGRzdF9tZW1wb29sX251bSwKLQkJCW4tPnRyYW5zX2NhY2hlKTsKLQlpZiAoIW4tPnRyYW5zX3Bvb2wpCi0JCWdvdG8gZXJyX291dF9jYWNoZV9kZXN0cm95OwotCi0JbXV0ZXhfaW5pdCgmbi0+dHJhbnNfbG9jayk7Ci0Jbi0+dHJhbnNfcm9vdCA9IFJCX1JPT1Q7Ci0KLQlJTklUX0RFTEFZRURfV09SSygmbi0+dHJhbnNfd29yaywgZHN0X3RyYW5zX3NjYW4pOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbi0+dHJhbnNfd29yaywgbi0+dHJhbnNfc2Nhbl90aW1lb3V0KTsKLQotCWRwcmludGsoIiVzOiBuOiAlcCwgc2l6ZTogJXUsIGNyeXB0bzogJXUuXG4iLAotCQlfX2Z1bmNfXywgbiwgc2l6ZSwgbi0+Y3J5cHRvLmNyeXB0b19hdHRhY2hlZF9zaXplKTsKLQotCXJldHVybiAwOwotCi1lcnJfb3V0X2NhY2hlX2Rlc3Ryb3k6Ci0Ja21lbV9jYWNoZV9kZXN0cm95KG4tPnRyYW5zX2NhY2hlKTsKLWVycl9vdXRfZXhpdDoKLQlyZXR1cm4gLUVOT01FTTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL0tjb25maWcKaW5kZXggM2FiZTdjOS4uM2RlZmEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL0tjb25maWcKQEAgLTQ3LDcgKzQ3LDcgQEAKIGNvbmZpZyBQQU5FTF9LRVlQQUQKIAlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiCiAJaW50ICJLZXlwYWQgdHlwZSAoMD1ub25lLCAxPW9sZCA2IGtleXMsIDI9bmV3IDYga2V5cywgMz1OZXhjb20gNCBrZXlzKSIKLQlyYW5nZSAwIDQKKwlyYW5nZSAwIDMKIAlkZWZhdWx0IDAKIAktLS1oZWxwLS0tCiAJICBUaGlzIGVuYWJsZXMgYW5kIGNvbmZpZ3VyZXMgYSBrZXlwYWQgY29ubmVjdGVkIHRvIHRoZSBwYXJhbGxlbCBwb3J0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwppbmRleCBmOThhNTI0Li45NWM5M2U4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwpAQCAtMzc4LDcgKzM3OCw3IEBACiAKICNpZmRlZiBDT05GSUdfUEFORUxfTENEX0NIQVJTRVQKICN1bmRlZiBERUZBVUxUX0xDRF9DSEFSU0VUCi0jZGVmaW5lIERFRkFVTFRfTENEX0NIQVJTRVQKKyNkZWZpbmUgREVGQVVMVF9MQ0RfQ0hBUlNFVCBDT05GSUdfUEFORUxfTENEX0NIQVJTRVQKICNlbmRpZgogCiAjZW5kaWYgLyogREVGQVVMVF9QUk9GSUxFID09IDAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL1RPRE8KaW5kZXggYmFjNDBkNi4uOGQ2NGUyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL1RPRE8KQEAgLTEsNiArMSw1IEBACiBUT0RPOgogCS0gQWRkIHN1cHBvcnQgZm9yIHN3YXAgbm90aWZpZXJzCi0JLSBSZW1vdmUgQ09ORklHX0FSTSBoYWNrCiAKIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kCiBOaXRpbiBHdXB0YSA8bmd1cHRhQHZmbGFyZS5vcmc+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmMKaW5kZXggYjgzOWYwNS4uOTg5ZmFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9kcnYuYwpAQCAtMjIyLDI4ICsyMjIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHJhbXpzd2FwX2ZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQotewotI2lmZGVmIENPTkZJR19BUk0KLQlpbnQgZmxhZyA9IDA7Ci0JLyoKLQkgKiBVZ2x5IGhhY2sgdG8gZ2V0IGZsdXNoX2RjYWNoZV9wYWdlKCkgd29yayBvbiBBUk0uCi0JICogcGFnZV9tYXBwaW5nKHBhZ2UpID09IE5VTEwgYWZ0ZXIgY2xlYXJpbmcgdGhpcyBzd2FwIGNhY2hlIGZsYWcuCi0JICogV2l0aG91dCBjbGVhcmluZyB0aGlzIGZsYWcsIGZsdXNoX2RjYWNoZV9wYWdlKCkgd2lsbCBzaW1wbHkgc2V0Ci0JICogIlBHX2RjYWNoZV9kaXJ0eSIgYml0IGFuZCByZXR1cm4uCi0JICovCi0JaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKLQkJZmxhZyA9IDE7Ci0JCUNsZWFyUGFnZVN3YXBDYWNoZShwYWdlKTsKLQl9Ci0jZW5kaWYKLQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLSNpZmRlZiBDT05GSUdfQVJNCi0JaWYgKGZsYWcpCi0JCVNldFBhZ2VTd2FwQ2FjaGUocGFnZSk7Ci0jZW5kaWYKLX0KLQogdm9pZCByYW16c3dhcF9pb2N0bF9nZXRfc3RhdHMoc3RydWN0IHJhbXpzd2FwICpyenMsCiAJCQlzdHJ1Y3QgcmFtenN3YXBfaW9jdGxfc3RhdHMgKnMpCiB7CkBAIC02NTUsNyArNjMzLDcgQEAKIAltZW1zZXQodXNlcl9tZW0sIDAsIFBBR0VfU0laRSk7CiAJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOwogCi0JcmFtenN3YXBfZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAKIAlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOwogCWJpb19lbmRpbyhiaW8sIDApOwpAQCAtNjc5LDcgKzY1Nyw3IEBACiAJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOwogCWt1bm1hcF9hdG9taWMoY21lbSwgS01fVVNFUjEpOwogCi0JcmFtenN3YXBfZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAKIAlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOwogCWJpb19lbmRpbyhiaW8sIDApOwpAQCAtNzc5LDcgKzc1Nyw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJhbXpzd2FwX2ZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCiAJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKIAliaW9fZW5kaW8oYmlvLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggMzIyMmMyMi4uMGQ0OTBjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKQEAgLTEzMTgsMTMgKzEzMTgsMTMgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywKIAlpbnQgaGRyX2xlbik7CiAKLWV4dGVybiBpbnQgaWVlZTgwMjExX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J0bF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICopOwogCiAKIC8qIGllZWU4MDIxMV9yeC5jICovCi1leHRlcm4gaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J0bF9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKTsKIGV4dGVybiB2b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZWFkZXIsCkBAIC0xMzc2LDggKzEzNzYsOCBAQAogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3J0bF93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9ydGxfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKIGV4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKQEAgLTEzODUsNyArMTM4NSw3IEBACiBleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CiBleHRlcm4gdm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsdTgqIGFzU3RhLHU4IGFzUnNuKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9ydGxfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CiAKIC8vQWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKIGV4dGVybiB2b2lkIFNlbmREaXNhc3NvY2lhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKaW5kZXggZjg4MmRkOC4uOTEyOGMxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogLyogQWxsIHJlY2VpdmVkIGZyYW1lcyBhcmUgc2VudCB0byB0aGlzIGZ1bmN0aW9uLiBAc2tiIGNvbnRhaW5zIHRoZSBmcmFtZSBpbgogICogSUVFRSA4MDIuMTEgZm9ybWF0LCBpLmUuLCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBzZW50IG92ZXIgYWlyLgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkuICovCi1pbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGllZWU4MDIxMV9ydGxfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggMWZlMTljMy4uYzdjNjQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC02ODksNyArNjg5LDcgQEAKIH0KIAogLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBoZWxkICovCi12b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQordm9pZCBpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCiAJewpAQCAtMTE5Niw3ICsxMTk2LDcgQEAKIAl9CiB9CiAKLXZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqY2hhbGxlbmdlLCBpbnQgY2hsZW4pCit2b2lkIGllZWU4MDIxMV9ydGxfYXV0aF9jaGFsbGVuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpjaGFsbGVuZ2UsIGludCBjaGxlbikKIHsKIAl1OCAqYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTg5OCw3ICsxODk4LDcgQEAKIAogCQkJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKGllZWUpOwogCQkJCQkJCX1lbHNlewotCQkJCQkJCQlpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7CisJCQkJCQkJCWllZWU4MDIxMV9ydGxfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7CiAJCQkJCQkJfQogCQkJCQkJfWVsc2V7CiAJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX2VycisrOwpAQCAtMjA0Nyw3ICsyMDQ3LDcgQEAKIAogfQogCi12b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQordm9pZCBpZWVlODAyMTFfcnRsX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjA4OSw3ICsyMDg5LDcgQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQordm9pZCBpZWVlODAyMTFfcnRsX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJLy91bnNpZ25lZCBsb25nIGZsYWdzOwogCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOwpAQCAtMjMwMSw3ICsyMzAxLDcgQEAKIC8vI2Vsc2UKIAlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CiAJCWllZWUtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKLQkJaWVlZTgwMjExX3N0YXJ0X3NjYW4oaWVlZSk7CisJCWllZWU4MDIxMV9ydGxfc3RhcnRfc2NhbihpZWVlKTsKIAl9CiAvLyNlbmRpZgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKQEAgLTIzNTcsNyArMjM1Nyw3IEBACiAJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CiAJCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOwogCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7Ci0JCWllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOworCQlpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oaWVlZSk7CiAJfQogCS8vWUosYWRkLDA4MDgyOCwgbm90aWZ5IG9zIGhlcmUKIAlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwppbmRleCBkZGUxZjJlLi42OWJkMDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtMzA0LDcgKzMwNCw3IEBACiB9CiAKIC8qIFNLQnMgYXJlIGFkZGVkIHRvIHRoZSBpZWVlLT50eF9xdWV1ZS4gKi8KLWludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGllZWU4MDIxMV9ydGxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKaW5kZXggNTdjNjJiMC4uZTBmMTNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKQEAgLTE4MTEsNyArMTgxMSw3IEBACiAJCQlpZihwcml2LT5yeF9za2ItPmxlbiA+IDQpCiAJCQkJc2tiX3RyaW0ocHJpdi0+cnhfc2tiLHByaXYtPnJ4X3NrYi0+bGVuLTQpOwogI2lmbmRlZiBSWF9ET05UX1BBU1NfVUwKLQkJCWlmKCFpZWVlODAyMTFfcngocHJpdi0+aWVlZTgwMjExLAorCQkJaWYoIWllZWU4MDIxMV9ydGxfcngocHJpdi0+aWVlZTgwMjExLAogCQkJCQkgcHJpdi0+cnhfc2tiLCAmc3RhdHMpKXsKICNlbmRpZiAvLyBSWF9ET05UX1BBU1NfVUwKIApAQCAtMTkxNywxMSArMTkxNywxMSBAQAogCWlmICghY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhkZXYsIHByaW9yaXR5KSl7CiAJCURNRVNHVygiRXJyb3I6IG5vIGRlc2NyaXB0b3IgbGVmdCBieSBwcmV2aW91cyBUWCAoYXZhaWwgJWQpICIsCiAJCQlnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LCBwcmlvcml0eSkpOwotCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShwcml2LT5pZWVlODAyMTEpOworCQlpZWVlODAyMTFfcnRsX3N0b3BfcXVldWUocHJpdi0+aWVlZTgwMjExKTsKIAl9CiAJcnRsODE4MF90eChkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIHByaW9yaXR5LCBtb3JlZnJhZywwLHJhdGUpOwogCWlmICghY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhkZXYsIHByaW9yaXR5KSkKLQkJaWVlZTgwMjExX3N0b3BfcXVldWUocHJpdi0+aWVlZTgwMjExKTsKKwkJaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKIH0KQEAgLTM2ODAsNyArMzY4MCw3IEBACiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSByODE4MF9zZXRfbWFjX2FkciwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCi0JLm5kb19zdGFydF94bWl0CQk9IGllZWU4MDIxMV94bWl0LAorCS5uZG9fc3RhcnRfeG1pdAkJPSBpZWVlODAyMTFfcnRsX3htaXQsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBydGw4MTgwX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKQEAgLTM5MDAsNyArMzkwMCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CiAKIAlpZihlbm91Z2hfZGVzYykKLQkJaWVlZTgwMjExX3dha2VfcXVldWUocHJpdi0+aWVlZTgwMjExKTsKKwkJaWVlZTgwMjExX3J0bF93YWtlX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CiB9CiAKIHZvaWQgcnRsODE4MF90eF9pc3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSxzaG9ydCBlcnJvcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYwppbmRleCA1MzZjYjZlLi4xMjRjZGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCkBAIC0zNzcsNyArMzc3LDcgQEAKIAkvLwlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICZwcml2LT5pZWVlODAyMTEtPnd4X3N5bmNfc2Nhbl93cSk7CiAJCS8vcHJpbnRrKCJzdGFydCBzY2FuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT5cbiIpOwogCQlpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8ocHJpdi0+aWVlZTgwMjExKTsKLS8vaWVlZTgwMjExX3N0YXJ0X3NjYW4ocHJpdi0+aWVlZTgwMjExKTsKKy8vaWVlZTgwMjExX3J0bF9zdGFydF9zY2FuKHByaXYtPmllZWU4MDIxMSk7CiAJCS8qIGludGVudGlvbmFsbHkgZm9yZ2V0IHRvIHVwIHNlbSAqLwogLy8JCQl1cCgmcHJpdi0+aWVlZTgwMjExLT53eF9zZW0pOwogCQkJcmV0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEuaAppbmRleCA5NzEzN2RkLi4zYmE5ZTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS5oCkBAIC0zMDMsOCArMzAzLDggQEAKICNkZWZpbmUgaWVlZTgwMjExX3J4X21ndAkJaWVlZTgwMjExX3J4X21ndF9yc2wKIAogI2RlZmluZSBpZWVlODAyMTFfZ2V0X2JlYWNvbgkJaWVlZTgwMjExX2dldF9iZWFjb25fcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93YWtlX3F1ZXVlCQlpZWVlODAyMTFfd2FrZV9xdWV1ZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUJCWllZWU4MDIxMV9zdG9wX3F1ZXVlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfcnRsX3dha2VfcXVldWUJCWllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlCQlpZWVlODAyMTFfcnRsX3N0b3BfcXVldWVfcnNsCiAjZGVmaW5lIGllZWU4MDIxMV9yZXNldF9xdWV1ZQkJaWVlZTgwMjExX3Jlc2V0X3F1ZXVlX3JzbAogI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2xfcnNsCiAjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sX3JzbApAQCAtMjQzNSwxMyArMjQzNSwxMyBAQAogCXN0cnVjdCBza19idWZmICpmcmFnLAogCWludCBoZHJfbGVuKTsKIAotZXh0ZXJuIGludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorZXh0ZXJuIGludCBpZWVlODAyMTFfcnRsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfdHhiX2ZyZWUoc3RydWN0IGllZWU4MDIxMV90eGIgKik7CiAKIAogLyogaWVlZTgwMjExX3J4LmMgKi8KLWV4dGVybiBpbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorZXh0ZXJuIGludCBpZWVlODAyMTFfcnRsX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpOwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3J4X21ndChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlciwKQEAgLTI1MDIsOCArMjUwMiw4IEBACiBleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKIGV4dGVybiB2b2lkIGllZWU4MDIxMV9yZXNldF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnRsX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggODNjODQ1Mi4uYWE3NjM5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC0zMzMsOCArMzMzLDggQEAKICNkZWZpbmUgaWVlZTgwMjExX3J4X21ndAkJaWVlZTgwMjExX3J4X21ndF9yc2wKIAogI2RlZmluZSBpZWVlODAyMTFfZ2V0X2JlYWNvbgkJaWVlZTgwMjExX2dldF9iZWFjb25fcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93YWtlX3F1ZXVlCQlpZWVlODAyMTFfd2FrZV9xdWV1ZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUJCWllZWU4MDIxMV9zdG9wX3F1ZXVlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfcnRsX3dha2VfcXVldWUJCWllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlCQlpZWVlODAyMTFfcnRsX3N0b3BfcXVldWVfcnNsCiAjZGVmaW5lIGllZWU4MDIxMV9yZXNldF9xdWV1ZQkJaWVlZTgwMjExX3Jlc2V0X3F1ZXVlX3JzbAogI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2xfcnNsCiAjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sX3JzbApAQCAtMjU0NiwxMyArMjU0NiwxMyBAQAogCXN0cnVjdCBza19idWZmICpmcmFnLAogCWludCBoZHJfbGVuKTsKIAotZXh0ZXJuIGludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorZXh0ZXJuIGludCBpZWVlODAyMTFfcnRsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfdHhiX2ZyZWUoc3RydWN0IGllZWU4MDIxMV90eGIgKik7CiAKIAogLyogaWVlZTgwMjExX3J4LmMgKi8KLWV4dGVybiBpbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorZXh0ZXJuIGludCBpZWVlODAyMTFfcnRsX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpOwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3J4X21ndChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlciwKQEAgLTI2MTMsOCArMjYxMyw4IEBACiBleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKIGV4dGVybiB2b2lkIGllZWU4MDIxMV9yZXNldF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnRsX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwppbmRleCAyNjQ0MTU1Li5mNDNhN2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKWRldi0+cHJpdjsKICNlbmRpZgogI2lmIDAKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGllZWU4MDIxMV94bWl0OworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaWVlZTgwMjExX3J0bF94bWl0OwogI2VuZGlmCiAKIAltZW1zZXQoaWVlZSwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKStzaXplb2ZfcHJpdik7CkBAIC0zMzMsNyArMzMzLDcgQEAKIGV4dGVybiBpbnQgaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQodm9pZCk7CiAKLWludCBfX2luaXQgaWVlZTgwMjExX2luaXQodm9pZCkKK2ludCBfX2luaXQgaWVlZTgwMjExX3J0bF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOwogCWludCByZXR2YWw7CkBAIC0zODksNyArMzg5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2V4aXQgaWVlZTgwMjExX2V4aXQodm9pZCkKK3ZvaWQgX19leGl0IGllZWU4MDIxMV9ydGxfZXhpdCh2b2lkKQogewogCWlmIChpZWVlODAyMTFfcHJvYykgewogCQlyZW1vdmVfcHJvY19lbnRyeSgiZGVidWdfbGV2ZWwiLCBpZWVlODAyMTFfcHJvYyk7CkBAIC00MTIsOCArNDEyLDggQEAKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOwogCiAKLS8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2V4aXQpOwotLy9tb2R1bGVfaW5pdChpZWVlODAyMTFfaW5pdCk7CisvL21vZHVsZV9leGl0KGllZWU4MDIxMV9ydGxfZXhpdCk7CisvL21vZHVsZV9pbml0KGllZWU4MDIxMV9ydGxfaW5pdCk7CiAjZW5kaWYKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwppbmRleCA1ZGM0NzhiLi4wNmQ5MTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTkyMyw3ICs5MjMsNyBAQAogLyogQWxsIHJlY2VpdmVkIGZyYW1lcyBhcmUgc2VudCB0byB0aGlzIGZ1bmN0aW9uLiBAc2tiIGNvbnRhaW5zIHRoZSBmcmFtZSBpbgogICogSUVFRSA4MDIuMTEgZm9ybWF0LCBpLmUuLCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBzZW50IG92ZXIgYWlyLgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkuICovCi1pbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGllZWU4MDIxMV9ydGxfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IDU5M2QyMjguLjZkMWRkZWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC02ODQsNyArNjg0LDcgQEAKIH0KIAogLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBoZWxkICovCi12b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQordm9pZCBpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAjaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQpAQCAtMTQzMCw3ICsxNDMwLDcgQEAKIAl9CiB9CiAKLXZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqY2hhbGxlbmdlLCBpbnQgY2hsZW4pCit2b2lkIGllZWU4MDIxMV9ydGxfYXV0aF9jaGFsbGVuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpjaGFsbGVuZ2UsIGludCBjaGxlbikKIHsKIAl1OCAqYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMjI2Miw3ICsyMjYyLDcgQEAKIAogCQkJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKGllZWUpOwogCQkJCQkJCX1lbHNlewotCQkJCQkJCQlpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7CisJCQkJCQkJCWllZWU4MDIxMV9ydGxfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7CiAJCQkJCQkJfQogCQkJCQkJfWVsc2V7CiAJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX2VycisrOwpAQCAtMjM3Niw3ICsyMzc2LDcgQEAKIAkJCSAqIHRvIGNoZWNrIGl0IGFueSBtb3JlLgogCQkJICogKi8KIAkJCS8vcHJpbnRrKCJlcnJvcjpubyBkZXNjcmlwdG9yIGxlZnRAcXVldWVfaW5kZXggJWRcbiIsIHF1ZXVlX2luZGV4KTsKLQkJCS8vaWVlZTgwMjExX3N0b3BfcXVldWUoaWVlZSk7CisJCQkvL2llZWU4MDIxMV9ydGxfc3RvcF9xdWV1ZShpZWVlKTsKICNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQogCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl9kcnZfYWdnUVtxdWV1ZV9pbmRleF0sIHR4Yi0+ZnJhZ21lbnRzW2ldKTsKICNlbHNlCkBAIC0yNDQwLDcgKzI0NDAsNyBAQAogCiB9CiAKLXZvaWQgaWVlZTgwMjExX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit2b2lkIGllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNDgxLDcgKzI0ODEsNyBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit2b2lkIGllZWU4MDIxMV9ydGxfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CkBAIC0yNzA2LDcgKzI3MDYsNyBAQAogCiAJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspewogCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7Ci0JCWllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOworCQlpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oaWVlZSk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KQEAgLTI3NzUsNyArMjc3NSw3IEBACiAJewogCQlpZWVlLT5pc19yb2FtaW5nPSBmYWxzZTsKIAkJaWVlZS0+YWN0c2Nhbm5pbmcgPSB0cnVlOwotCQlpZWVlODAyMTFfc3RhcnRfc2NhbihpZWVlKTsKKwkJaWVlZTgwMjExX3J0bF9zdGFydF9zY2FuKGllZWUpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKQEAgLTM0OTcsOCArMzQ5Nyw4IEBACiAKICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQogLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfYmVhY29uKTsKLS8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd2FrZV9xdWV1ZSk7Ci0vL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfcXVldWUpOworLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZSk7CisvL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlKTsKIC8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcmVzZXRfcXVldWUpOwogLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wpOwogLy9FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKTsKQEAgLTM1MTgsOCArMzUxOCw4IEBACiAvL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKTsKICNlbHNlCiBFWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfZ2V0X2JlYWNvbik7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd2FrZV9xdWV1ZSk7Ci1FWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfc3RvcF9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfcnRsX3dha2VfcXVldWUpOworRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX3J0bF9zdG9wX3F1ZXVlKTsKIEVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9yZXNldF9xdWV1ZSk7CiBFWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKTsKIEVYUE9SVF9TWU1CT0xfTk9WRVJTKGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IDEwM2IzM2MuLjc5OGZiNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtNjA0LDcgKzYwNCw3IEBACiAJfQogfQogCi1pbnQgaWVlZTgwMjExX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK2ludCBpZWVlODAyMTFfcnRsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwppbmRleCA0ZTM0YTFmNC4uMzQ0MWI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC05NzYsNyArOTc2LDcgQEAKIAl7CiAJCWlmIChsZW4gIT0gaWVbMV0rMikKIAkJewotCQkJcHJpbnRrKCJsZW46JWQsIGllOiVkXG4iLCBsZW4sIGllWzFdKTsKKwkJCXByaW50aygibGVuOiV6dSwgaWU6JWRcbiIsIGxlbiwgaWVbMV0pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCmluZGV4IDk4YjNiYjYuLmU0MWU4YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKQEAgLTM4Miw3ICszODIsNyBAQAogCiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KQogCXsKLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIEJBUkVRKCVkIC8gJWQpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDkpKTsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIEJBUkVRKCVkIC8gJXp1KVxuIiwgc2tiLT5sZW4sIAkoc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KQogCXsKLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIEJBUlNQKCVkIC8gJWQpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDkpKTsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIEJBUlNQKCVkIC8gJXp1KVxuIiwgc2tiLT5sZW4sIAkoc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KSk7CiAJCXJldHVybiAtMTsKIAl9CiAJcnNwID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiLT5kYXRhOwpAQCAtNjExLDcgKzYxMSw3IEBACiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDYpCiAJewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiBJbnZhbGlkIHNrYiBsZW4gaW4gREVMQkEoJWQgLyAlZClcbiIsIHNrYi0+bGVuLCAJKHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgNikpOworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiBJbnZhbGlkIHNrYiBsZW4gaW4gREVMQkEoJWQgLyAlenUpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDYpKTsKIAkJcmV0dXJuIC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYwppbmRleCBmZjhmZTdlLi4wY2E1ZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYwpAQCAtNTc5NSw3ICs1Nzk1LDcgQEAKICAgICAgICAgICAgICAgICBzdGF0cy5mcmFnb2Zmc2V0ID0gMDsKICAgICAgICAgICAgICAgICBzdGF0cy5udG90YWxmcmFnID0gMTsKIAotICAgICAgICAgICAgICAgIGlmKCFpZWVlODAyMTFfcngocHJpdi0+aWVlZTgwMjExLCBza2IsICZzdGF0cykpeworICAgICAgICAgICAgICAgIGlmKCFpZWVlODAyMTFfcnRsX3J4KHByaXYtPmllZWU4MDIxMSwgc2tiLCAmc3RhdHMpKXsKICAgICAgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwcml2LT5zdGF0cy5yeG9rKys7CkBAIC01ODM3LDcgKzU4MzcsNyBAQAogCS5uZG9fZG9faW9jdGwgPQkJCXJ0bDgxOTJfaW9jdGwsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPQlyODE5Ml9zZXRfbXVsdGljYXN0LAogCS5uZG9fc2V0X21hY19hZGRyZXNzID0JCXI4MTkyX3NldF9tYWNfYWRyLAotCS5uZG9fc3RhcnRfeG1pdCA9IAkJaWVlZTgwMjExX3htaXQsCisJLm5kb19zdGFydF94bWl0ID0gCQlpZWVlODAyMTFfcnRsX3htaXQsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjEyMSwxNCArNjEyMSwxNCBAQAogCVJUX1RSQUNFKENPTVBfRE9XTiwgIndsYW4gZHJpdmVyIHJlbW92ZWRcbiIpOwogfQogCi1leHRlcm4gaW50IGllZWU4MDIxMV9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9ydGxfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9ydGxfZXhpdCh2b2lkKTsKIAogc3RhdGljIGludCBfX2luaXQgcnRsODE5Ml9wY2lfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwogCi0JcmV0dmFsID0gaWVlZTgwMjExX2luaXQoKTsKKwlyZXR2YWwgPSBpZWVlODAyMTFfcnRsX2luaXQoKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCkBAIC02MTUzLDcgKzYxNTMsNyBAQAogCiAJUlRfVFJBQ0UoQ09NUF9ET1dOLCAiRXhpdGluZyIpOwogCXJ0bDgxOTJfcHJvY19tb2R1bGVfcmVtb3ZlKCk7Ci0JaWVlZTgwMjExX2V4aXQoKTsKKwlpZWVlODAyMTFfcnRsX2V4aXQoKTsKIH0KIAogLy93YXJuaW5nIG1lc3NhZ2UgV0IKQEAgLTYzMTMsNyArNjMxMyw3IEBACiAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOwogCiAJaWYoZW5vdWdoX2Rlc2MpCi0JCWllZWU4MDIxMV93YWtlX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CisJCWllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZShwcml2LT5pZWVlODAyMTEpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggZjIyZDAyNC4uOWE0Yzg1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExLmgKQEAgLTE3MjEsMTMgKzE3MjEsMTMgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywKIAlpbnQgaGRyX2xlbik7CiAKLWV4dGVybiBpbnQgcnRsODE5Ml9pZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorZXh0ZXJuIGludCBydGw4MTkyX2llZWU4MDIxMV9ydGxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKTsKIAogCiAvKiBpZWVlODAyMTFfcnguYyAqLwotZXh0ZXJuIGludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCitleHRlcm4gaW50IGllZWU4MDIxMV9ydGxfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cyk7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyLApAQCAtMTc4Myw4ICsxNzgzLDggQEAKIGV4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKIGV4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLWV4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnRsX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogZXh0ZXJuIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CiBleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKIGV4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IGFjMjIzY2UuLmZlY2ZhMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCkBAIC0yMDgsNyArMjA4LDcgQEAKICAqCiAgKiBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgbWFuYWdlbWVudCBjb250cm9sIGZyYW1lcwogICoKLSAqIENhbGxlZCBieSBpZWVlODAyMTFfcnggKi8KKyAqIENhbGxlZCBieSBpZWVlODAyMTFfcnRsX3J4ICovCiBzdGF0aWMgaW5saW5lIGludAogaWVlZTgwMjExX3J4X2ZyYW1lX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCkBAIC0yODksNyArMjg5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBpZWVlODAyMTFfcnggKi8KKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSwgYnkgaWVlZTgwMjExX3J0bF9yeCAqLwogc3RhdGljIGlubGluZSBpbnQKIGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKQEAgLTg1OCw3ICs4NTgsNyBAQAogLyogQWxsIHJlY2VpdmVkIGZyYW1lcyBhcmUgc2VudCB0byB0aGlzIGZ1bmN0aW9uLiBAc2tiIGNvbnRhaW5zIHRoZSBmcmFtZSBpbgogICogSUVFRSA4MDIuMTEgZm9ybWF0LCBpLmUuLCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBzZW50IG92ZXIgYWlyLgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkuICovCi1pbnQgaWVlZTgwMjExX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGllZWU4MDIxMV9ydGxfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggMjAzYzBhNS4uOTVkNGY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC02MTAsNyArNjEwLDcgQEAKIH0KIAogLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBoZWxkICovCi12b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQordm9pZCBpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCiAJewpAQCAtMTI4MSw3ICsxMjgxLDcgQEAKIAl9CiB9CiAKLXZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqY2hhbGxlbmdlLCBpbnQgY2hsZW4pCit2b2lkIGllZWU4MDIxMV9ydGxfYXV0aF9jaGFsbGVuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpjaGFsbGVuZ2UsIGludCBjaGxlbikKIHsKIAl1OCAqYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMjA1NCw3ICsyMDU0LDcgQEAKIAogCQkJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKGllZWUpOwogCQkJCQkJCX1lbHNlewotCQkJCQkJCQlpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7CisJCQkJCQkJCWllZWU4MDIxMV9ydGxfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7CiAJCQkJCQkJfQogCQkJCQkJfWVsc2V7CiAJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX2VycisrOwpAQCAtMjE2Miw3ICsyMTYyLDcgQEAKIAkJCSAqIHRvIGNoZWNrIGl0IGFueSBtb3JlLgogCQkJICogKi8KIAkJCS8vcHJpbnRrKCJlcnJvcjpubyBkZXNjcmlwdG9yIGxlZnRAcXVldWVfaW5kZXggJWQsICVkLCAlZFxuIiwgcXVldWVfaW5kZXgsIHNrYl9xdWV1ZV9sZW4oJmllZWUtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0pLCBpZWVlLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoaWVlZS0+ZGV2LHF1ZXVlX2luZGV4KSk7Ci0JCQkvL2llZWU4MDIxMV9zdG9wX3F1ZXVlKGllZWUpOworCQkJLy9pZWVlODAyMTFfcnRsX3N0b3BfcXVldWUoaWVlZSk7CiAJCQlza2JfcXVldWVfdGFpbCgmaWVlZS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSwgdHhiLT5mcmFnbWVudHNbaV0pOwogCQl9ZWxzZXsKIAkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCkBAIC0yMjIyLDcgKzIyMjIsNyBAQAogCiB9CiAKLXZvaWQgaWVlZTgwMjExX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit2b2lkIGllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yMjYzLDcgKzIyNjMsNyBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit2b2lkIGllZWU4MDIxMV9ydGxfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CkBAIC0yNDc5LDcgKzI0NzksNyBAQAogCiAJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspewogCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7Ci0JCWllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOworCQlpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oaWVlZSk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KQEAgLTI1NTIsNyArMjU1Miw3IEBACiAJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKIAl7CiAJCWllZWUtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKLQkJaWVlZTgwMjExX3N0YXJ0X3NjYW4oaWVlZSk7CisJCWllZWU4MDIxMV9ydGxfc3RhcnRfc2NhbihpZWVlKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IDYwNjIxZDYuLjRkNTRlMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC02MDQsNyArNjA0LDcgQEAKIAl9CiB9CiAKLWludCBydGw4MTkyX2llZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpbnQgcnRsODE5Ml9pZWVlODAyMTFfcnRsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV9jb3JlLmMKaW5kZXggNjYyNzRkNy4uY2NiOWQ1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX2NvcmUuYwpAQCAtMTI2LDYgKzEyNiw4IEBACiAJe1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMzMDEpfSwKIAkvKiBaaW53ZWxsICovCiAJe1VTQl9ERVZJQ0UoMHg1YTU3LCAweDAyOTApfSwKKwkvKiBHdWlsbGVtb3QgKi8KKwl7VVNCX0RFVklDRSgweDA2ZjgsIDB4ZTAzMSl9LAogCS8vOTJTVQogCXtVU0JfREVWSUNFKDB4MGJkYSwgMHg4MTcyKX0sCiAJe30KQEAgLTE1MDEsNyArMTUwMyw3IEBACiAgICAgICAgIHVyYi0+Y29udGV4dCA9IHNrYjsKICAgICAgICAgc2tiX3F1ZXVlX3RhaWwoJnByaXYtPnJ4X3F1ZXVlLCBza2IpOwogICAgICAgICBlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotCWlmKGVyciAmJiBlcnIgIT0gRVBFUk0pCisJaWYoZXJyICYmIGVyciAhPSAtRVBFUk0pCiAJCXByaW50aygiY2FuIG5vdCBzdWJtaXQgcnh1cmIsIGVyciBpcyAleCxVUkIgc3RhdHVzIGlzICV4XG4iLGVycix1cmItPnN0YXR1cyk7CiB9CiAKQEAgLTcxNTUsNyArNzE1Nyw3IEBACiAJCQl1bmljYXN0X3BhY2tldCA9IHRydWU7CiAJCX0KIAotCQlpZighaWVlZTgwMjExX3J4KHByaXYtPmllZWU4MDIxMSxza2IsICZzdGF0cykpIHsKKwkJaWYoIWllZWU4MDIxMV9ydGxfcngocHJpdi0+aWVlZTgwMjExLHNrYiwgJnN0YXRzKSkgewogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJfSBlbHNlIHsKIAkJLy8JcHJpdi0+c3RhdHMucnhva3RvdGFsKys7ICAvL1lKLHRlc3QsMDkwMTA4CkBAIC03NDI2LDcgKzc0MjgsNyBAQAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gcjgxOTJfc2V0X21hY19hZHIsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAotCS5uZG9fc3RhcnRfeG1pdAkJPSBydGw4MTkyX2llZWU4MDIxMV94bWl0LAorCS5uZG9fc3RhcnRfeG1pdAkJPSBydGw4MTkyX2llZWU4MDIxMV9ydGxfeG1pdCwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxOTJfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLApAQCAtNzYxOSw3ICs3NjIxLDcgQEAKICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CiAKIAlpZihlbm91Z2hfZGVzYykKLQkJaWVlZTgwMjExX3dha2VfcXVldWUocHJpdi0+aWVlZTgwMjExKTsKKwkJaWVlZTgwMjExX3J0bF93YWtlX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CiB9CiAKIHZvaWQgRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IGQzOTdmMWQuLjVmMTJkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtODQ1LDcgKzg0NSw3IEBACiAJewogCQlpZiAobGVuICE9IGllWzFdKzIpCiAJCXsKLQkJCXByaW50aygibGVuOiVkLCBpZTolZFxuIiwgbGVuLCBpZVsxXSk7CisJCQlwcmludGsoImxlbjolenUsIGllOiVkXG4iLCBsZW4sIGllWzFdKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYwppbmRleCAyNmFmNDNiLi41MTJhNTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCkBAIC0zNDAsNyArMzQwLDcgQEAKIAogCWlmIChza2ItPmxlbiA8IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgOSkKIAl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiIEludmFsaWQgc2tiIGxlbiBpbiBCQVJFUSglZCAvICVkKVxuIiwgc2tiLT5sZW4sIAkoc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KSk7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiIEludmFsaWQgc2tiIGxlbiBpbiBCQVJFUSglZCAvICV6dSlcbiIsIHNrYi0+bGVuLCAJKHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgOSkpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC00MzksNyArNDM5LDcgQEAKIAogCWlmIChza2ItPmxlbiA8IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgOSkKIAl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiIEludmFsaWQgc2tiIGxlbiBpbiBCQVJTUCglZCAvICVkKVxuIiwgc2tiLT5sZW4sIAkoc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KSk7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiIEludmFsaWQgc2tiIGxlbiBpbiBCQVJTUCglZCAvICV6dSlcbiIsIHNrYi0+bGVuLCAJKHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgOSkpOwogCQlyZXR1cm4gLTE7CiAJfQogCXJzcCA9ICggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqKXNrYi0+ZGF0YTsKQEAgLTU2OSw3ICs1NjksNyBAQAogCiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA2KQogCXsKLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIERFTEJBKCVkIC8gJWQpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDYpKTsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIERFTEJBKCVkIC8gJXp1KVxuIiwgc2tiLT5sZW4sIAkoc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA2KSk7CiAJCXJldHVybiAtMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0ZGJmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9LY29uZmlnCkBAIC0wLDAgKzEsMTUgQEAKK2NvbmZpZyBGQl9TTTdYWAorCXRyaXN0YXRlICJTaWxpY29uIE1vdGlvbiBTTTdYWCBGcmFtZSBCdWZmZXIgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCCisJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAorCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKKwlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAorCWhlbHAKKwkgIEZyYW1lIEJ1ZmZlciBkcml2ZXIgZm9yIHRoZSBTaWxpY29uIE1vdGlvbiBTTTdYWCBzZXJpYWwgZ3JhcGhpYyBjYXJkLgorCitjb25maWcgRkJfU003WFhfQUNDRUwKKwlib29sICJTaWxpY29ubW90aW9uIEFjY2VsZXJhdGlvbiBmdW5jdGlvbnMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBGQl9TTTdYWCAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIHdpbGwgY29tcGlsZSB0aGUgVHJpZGVudCBmcmFtZSBidWZmZXIgZGV2aWNlIHdpdGgKKwkgIGFjY2VsZXJhdGlvbiBmdW5jdGlvbnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHgvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzY2I5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK29iai0kKENPTkZJR19GQl9TTTdYWCkgKz0gc203eHgubworCitzbTd4eC15IDo9IHNtdGNmYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHgvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNjFmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvVE9ETwpAQCAtMCwwICsxLDEwIEBACitUT0RPOgorLSBEdWFsIGhlYWQgc3VwcG9ydAorLSB1c2Uga2VybmVsIGNvZGluZyBzdHlsZQorLSBjaGVja3BhdGNoLnBsIGNsZWFuCistIHJlZmluZSB0aGUgY29kZSBhbmQgcmVtb3ZlIHVudXNlZCBjb2RlCistIHVzZSBrZXJuZWwgZnJhbWVidWZmZXIgbW9kZSBzZXR0aW5nIGluc3RlYWQgb2YgaGFyZCBjb2RlCistIG1vdmUgaXQgdG8gZHJpdmVycy92aWRlby9zbTd4eC8gb3IgbWFrZSBpdCBiZSBkcml2ZXJzL3ZpZGVvL3NtN3h4ZmIuYworCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQKK1RlZGR5IFdhbmcgPHRlZGR5LndhbmdAc2lsaWNvbm1vdGlvbi5jb20uY24+LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGMyZC5jIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGMyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzM2I4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210YzJkLmMKQEAgLTAsMCArMSw5NzkgQEAKKy8qCisgKiBTaWxpY29uIE1vdGlvbiBTTTdYWCAyRCBkcmF3aW5nIGVuZ2luZSBmdW5jdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbGljb24gTW90aW9uIFRlY2hub2xvZ3kgQ29ycC4KKyAqIEF1dGhvcjogQm95b2QgYm95b2QueWFuZ0BzaWxpY29ubW90aW9uLmNvbS5jbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBMZW1vdGUsIEluYy4KKyAqIEF1dGhvcjogV3UgWmhhbmdqaW4sIHd1empAbGVtb3RlLmNvbQorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqIFZlcnNpb24gMC4xMC4yNjE5Mi4yMS4wMQorICogCS0gQWRkIFBvd2VyUEMgc3VwcG9ydAorICogCS0gQWRkIDJEIHN1cHBvcnQgZm9yIEx5bnggLQorICogVmVyaWZpZWQgb24gMi42LjE5LjIKKyAqIAlCb3lvZC55YW5nICA8Ym95b2QueWFuZ0BzaWxpY29ubW90aW9uLmNvbS5jbj4KKyAqLworCit1bnNpZ25lZCBjaGFyIHNtdGNfZGVfYnVzeTsKKwordm9pZCBTTVRDX3dyaXRlMkRyZWcodW5zaWduZWQgbG9uZyBuT2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5EYXRhKQoreworCXdyaXRlbChuRGF0YSwgc210Y18yREJhc2VBZGRyZXNzICsgbk9mZnNldCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgU01UQ19yZWFkMkRyZWcodW5zaWduZWQgbG9uZyBuT2Zmc2V0KQoreworCXJldHVybiByZWFkbChzbXRjXzJEQmFzZUFkZHJlc3MgKyBuT2Zmc2V0KTsKK30KKwordm9pZCBTTVRDX3dyaXRlMkRkYXRhcG9ydCh1bnNpZ25lZCBsb25nIG5PZmZzZXQsIHVuc2lnbmVkIGxvbmcgbkRhdGEpCit7CisJd3JpdGVsKG5EYXRhLCBzbXRjXzJEZGF0YXBvcnQgKyBuT2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBkZUluaXQKKyAqCisgKiBQdXJwb3NlCisgKiAgICBEcmF3aW5nIGVuZ2luZSBpbml0aWFsaXphdGlvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBkZUluaXQodW5zaWduZWQgaW50IG5Nb2RlV2lkdGgsIHVuc2lnbmVkIGludCBuTW9kZUhlaWdodCwKKwkJdW5zaWduZWQgaW50IGJwcCkKK3sKKwkvKiBHZXQgY3VycmVudCBwb3dlciBjb25maWd1cmF0aW9uLiAqLworCXVuc2lnbmVkIGNoYXIgY2xvY2s7CisJY2xvY2sgPSBzbXRjX3NlcXIoMHgyMSk7CisKKwkvKiBpbml0aWFsaXplIGdsb2JhbCAnbXV0ZXggbG9jaycgdmFyaWFibGUgKi8KKwlzbXRjX2RlX2J1c3kgPSAwOworCisJLyogRW5hYmxlIDJEIERyYXdpbmcgRW5naW5lICovCisJc210Y19zZXF3KDB4MjEsIGNsb2NrICYgMHhGOCk7CisKKwlTTVRDX3dyaXRlMkRyZWcoREVfQ0xJUF9UTCwKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX0NMSVBfVEwsIFRPUCwgMCkgfAorCQkJRklFTERfU0VUKDAsIERFX0NMSVBfVEwsIFNUQVRVUywgRElTQUJMRSkgfAorCQkJRklFTERfU0VUKDAsIERFX0NMSVBfVEwsIElOSElCSVQsIE9VVFNJREUpIHwKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX0NMSVBfVEwsIExFRlQsIDApKTsKKworCWlmIChicHAgPj0gMjQpIHsKKwkJU01UQ193cml0ZTJEcmVnKERFX1BJVENILAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1BJVENILCBERVNUSU5BVElPTiwKKwkJCQkJICAgIG5Nb2RlV2lkdGggKiAzKSB8IEZJRUxEX1ZBTFVFKDAsCisJCQkJCQkJCSAgREVfUElUQ0gsCisJCQkJCQkJCSAgU09VUkNFLAorCQkJCQkJCQkgIG5Nb2RlV2lkdGgKKwkJCQkJCQkJICAqIDMpKTsKKwl9IGVsc2UgeworCQlTTVRDX3dyaXRlMkRyZWcoREVfUElUQ0gsCisJCQkJRklFTERfVkFMVUUoMCwgREVfUElUQ0gsIERFU1RJTkFUSU9OLAorCQkJCQkgICAgbk1vZGVXaWR0aCkgfCBGSUVMRF9WQUxVRSgwLAorCQkJCQkJCSAgICAgIERFX1BJVENILAorCQkJCQkJCSAgICAgIFNPVVJDRSwKKwkJCQkJCQkgICAgICBuTW9kZVdpZHRoKSk7CisJfQorCisJU01UQ193cml0ZTJEcmVnKERFX1dJTkRPV19XSURUSCwKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX1dJTkRPV19XSURUSCwgREVTVElOQVRJT04sCisJCQkJICAgIG5Nb2RlV2lkdGgpIHwgRklFTERfVkFMVUUoMCwKKwkJCQkJCQkgICAgICBERV9XSU5ET1dfV0lEVEgsCisJCQkJCQkJICAgICAgU09VUkNFLAorCQkJCQkJCSAgICAgIG5Nb2RlV2lkdGgpKTsKKworCXN3aXRjaCAoYnBwKSB7CisJY2FzZSA4OgorCQlTTVRDX3dyaXRlMkRyZWcoREVfU1RSRVRDSF9GT1JNQVQsCisJCQkJRklFTERfU0VUKDAsIERFX1NUUkVUQ0hfRk9STUFULCBQQVRURVJOX1hZLAorCQkJCQkgIE5PUk1BTCkgfCBGSUVMRF9WQUxVRSgwLAorCQkJCQkJCURFX1NUUkVUQ0hfRk9STUFULAorCQkJCQkJCVBBVFRFUk5fWSwKKwkJCQkJCQkwKSB8CisJCQkJRklFTERfVkFMVUUoMCwgREVfU1RSRVRDSF9GT1JNQVQsIFBBVFRFUk5fWCwKKwkJCQkgICAgMCkgfCBGSUVMRF9TRVQoMCwgREVfU1RSRVRDSF9GT1JNQVQsCisJCQkJCQkgICBQSVhFTF9GT1JNQVQsCisJCQkJCQkgICA4KSB8IEZJRUxEX1NFVCgwLAorCQkJCQkJCSAgREVfU1RSRVRDSF9GT1JNQVQsCisJCQkJCQkJICBBRERSRVNTSU5HLAorCQkJCQkJCSAgWFkpIHwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9TVFJFVENIX0ZPUk1BVCwKKwkJCQkJU09VUkNFX0hFSUdIVCwgMykpOworCQlicmVhazsKKwljYXNlIDI0OgorCQlTTVRDX3dyaXRlMkRyZWcoREVfU1RSRVRDSF9GT1JNQVQsCisJCQkJRklFTERfU0VUKDAsIERFX1NUUkVUQ0hfRk9STUFULCBQQVRURVJOX1hZLAorCQkJCQkgIE5PUk1BTCkgfCBGSUVMRF9WQUxVRSgwLAorCQkJCQkJCURFX1NUUkVUQ0hfRk9STUFULAorCQkJCQkJCVBBVFRFUk5fWSwKKwkJCQkJCQkwKSB8CisJCQkJRklFTERfVkFMVUUoMCwgREVfU1RSRVRDSF9GT1JNQVQsIFBBVFRFUk5fWCwKKwkJCQkgICAgMCkgfCBGSUVMRF9TRVQoMCwgREVfU1RSRVRDSF9GT1JNQVQsCisJCQkJCQkJICAgUElYRUxfRk9STUFULAorCQkJCQkJCSAgIDI0KSB8IEZJRUxEX1NFVCgwLAorCQkJCQkJCSAgIERFX1NUUkVUQ0hfRk9STUFULAorCQkJCQkJCSAgIEFERFJFU1NJTkcsCisJCQkJCQkJICAgWFkpIHwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9TVFJFVENIX0ZPUk1BVCwKKwkJCQkJU09VUkNFX0hFSUdIVCwgMykpOworCQlicmVhazsKKwljYXNlIDE2OgorCWRlZmF1bHQ6CisJCVNNVENfd3JpdGUyRHJlZyhERV9TVFJFVENIX0ZPUk1BVCwKKwkJCQlGSUVMRF9TRVQoMCwgREVfU1RSRVRDSF9GT1JNQVQsIFBBVFRFUk5fWFksCisJCQkJCSAgTk9STUFMKSB8IEZJRUxEX1ZBTFVFKDAsCisJCQkJCQkJREVfU1RSRVRDSF9GT1JNQVQsCisJCQkJCQkJUEFUVEVSTl9ZLAorCQkJCQkJCTApIHwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9TVFJFVENIX0ZPUk1BVCwgUEFUVEVSTl9YLAorCQkJCSAgICAwKSB8IEZJRUxEX1NFVCgwLCBERV9TVFJFVENIX0ZPUk1BVCwKKwkJCQkJCQkgICBQSVhFTF9GT1JNQVQsCisJCQkJCQkJICAgMTYpIHwgRklFTERfU0VUKDAsCisJCQkJCQkJICAgREVfU1RSRVRDSF9GT1JNQVQsCisJCQkJCQkJICAgQUREUkVTU0lORywKKwkJCQkJCQkgICBYWSkgfAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1NUUkVUQ0hfRk9STUFULAorCQkJCQlTT1VSQ0VfSEVJR0hULCAzKSk7CisJCWJyZWFrOworCX0KKworCVNNVENfd3JpdGUyRHJlZyhERV9NQVNLUywKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX01BU0tTLCBCWVRFX01BU0ssIDB4RkZGRikgfAorCQkJRklFTERfVkFMVUUoMCwgREVfTUFTS1MsIEJJVF9NQVNLLCAweEZGRkYpKTsKKwlTTVRDX3dyaXRlMkRyZWcoREVfQ09MT1JfQ09NUEFSRV9NQVNLLAorCQkJRklFTERfVkFMVUUoMCwgREVfQ09MT1JfQ09NUEFSRV9NQVNLLCBNQVNLUywgXAorCQkJCTB4RkZGRkZGKSk7CisJU01UQ193cml0ZTJEcmVnKERFX0NPTE9SX0NPTVBBUkUsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9DT0xPUl9DT01QQVJFLCBDT0xPUiwgMHhGRkZGRkYpKTsKK30KKwordm9pZCBkZVZlcnRpY2FsTGluZSh1bnNpZ25lZCBsb25nIGRzdF9iYXNlLAorCQkgICAgdW5zaWduZWQgbG9uZyBkc3RfcGl0Y2gsCisJCSAgICB1bnNpZ25lZCBsb25nIG5YLAorCQkgICAgdW5zaWduZWQgbG9uZyBuWSwKKwkJICAgIHVuc2lnbmVkIGxvbmcgZHN0X2hlaWdodCwgdW5zaWduZWQgbG9uZyBuQ29sb3IpCit7CisJZGVXYWl0Rm9yTm90QnVzeSgpOworCisJU01UQ193cml0ZTJEcmVnKERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFLAorCQkJRklFTERfVkFMVUUoMCwgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsIEFERFJFU1MsCisJCQkJICAgIGRzdF9iYXNlKSk7CisKKwlTTVRDX3dyaXRlMkRyZWcoREVfUElUQ0gsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgREVTVElOQVRJT04sIGRzdF9waXRjaCkgfAorCQkJRklFTERfVkFMVUUoMCwgREVfUElUQ0gsIFNPVVJDRSwgZHN0X3BpdGNoKSk7CisKKwlTTVRDX3dyaXRlMkRyZWcoREVfV0lORE9XX1dJRFRILAorCQkJRklFTERfVkFMVUUoMCwgREVfV0lORE9XX1dJRFRILCBERVNUSU5BVElPTiwKKwkJCSAgICBkc3RfcGl0Y2gpIHwgRklFTERfVkFMVUUoMCwgREVfV0lORE9XX1dJRFRILAorCQkJCQkJICAgICBTT1VSQ0UsCisJCQkJCQkgICAgIGRzdF9waXRjaCkpOworCisJU01UQ193cml0ZTJEcmVnKERFX0ZPUkVHUk9VTkQsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9GT1JFR1JPVU5ELCBDT0xPUiwgbkNvbG9yKSk7CisKKwlTTVRDX3dyaXRlMkRyZWcoREVfREVTVElOQVRJT04sCisJCQlGSUVMRF9TRVQoMCwgREVfREVTVElOQVRJT04sIFdSQVAsIERJU0FCTEUpIHwKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX0RFU1RJTkFUSU9OLCBYLCBuWCkgfAorCQkJRklFTERfVkFMVUUoMCwgREVfREVTVElOQVRJT04sIFksIG5ZKSk7CisKKwlTTVRDX3dyaXRlMkRyZWcoREVfRElNRU5TSU9OLAorCQkJRklFTERfVkFMVUUoMCwgREVfRElNRU5TSU9OLCBYLCAxKSB8CisJCQlGSUVMRF9WQUxVRSgwLCBERV9ESU1FTlNJT04sIFlfRVQsIGRzdF9oZWlnaHQpKTsKKworCVNNVENfd3JpdGUyRHJlZyhERV9DT05UUk9MLAorCQkJRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFNUQVRVUywgU1RBUlQpIHwKKwkJCUZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBESVJFQ1RJT04sIExFRlRfVE9fUklHSFQpIHwKKwkJCUZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBNQUpPUiwgWSkgfAorCQkJRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFNURVBfWCwgTkVHQVRJVkUpIHwKKwkJCUZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBTVEVQX1ksIFBPU0lUSVZFKSB8CisJCQlGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgTEFTVF9QSVhFTCwgT0ZGKSB8CisJCQlGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgQ09NTUFORCwgU0hPUlRfU1RST0tFKSB8CisJCQlGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgUk9QX1NFTEVDVCwgUk9QMikgfAorCQkJRklFTERfVkFMVUUoMCwgREVfQ09OVFJPTCwgUk9QLCAweDBDKSk7CisKKwlzbXRjX2RlX2J1c3kgPSAxOworfQorCit2b2lkIGRlSG9yaXpvbnRhbExpbmUodW5zaWduZWQgbG9uZyBkc3RfYmFzZSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBkc3RfcGl0Y2gsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgblgsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgblksCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZHN0X3dpZHRoLCB1bnNpZ25lZCBsb25nIG5Db2xvcikKK3sKKwlkZVdhaXRGb3JOb3RCdXN5KCk7CisKKwlTTVRDX3dyaXRlMkRyZWcoREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRSwgQUREUkVTUywKKwkJCQkgICAgZHN0X2Jhc2UpKTsKKworCVNNVENfd3JpdGUyRHJlZyhERV9QSVRDSCwKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX1BJVENILCBERVNUSU5BVElPTiwgZHN0X3BpdGNoKSB8CisJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgU09VUkNFLCBkc3RfcGl0Y2gpKTsKKworCVNNVENfd3JpdGUyRHJlZyhERV9XSU5ET1dfV0lEVEgsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfV0lEVEgsIERFU1RJTkFUSU9OLAorCQkJICAgIGRzdF9waXRjaCkgfCBGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfV0lEVEgsCisJCQkJCQkgICAgIFNPVVJDRSwKKwkJCQkJCSAgICAgZHN0X3BpdGNoKSk7CisJU01UQ193cml0ZTJEcmVnKERFX0ZPUkVHUk9VTkQsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9GT1JFR1JPVU5ELCBDT0xPUiwgbkNvbG9yKSk7CisJU01UQ193cml0ZTJEcmVnKERFX0RFU1RJTkFUSU9OLAorCQkJRklFTERfU0VUKDAsIERFX0RFU1RJTkFUSU9OLCBXUkFQLAorCQkJICBESVNBQkxFKSB8IEZJRUxEX1ZBTFVFKDAsIERFX0RFU1RJTkFUSU9OLCBYLAorCQkJCQkJIG5YKSB8IEZJRUxEX1ZBTFVFKDAsCisJCQkJCQkJICAgREVfREVTVElOQVRJT04sCisJCQkJCQkJICAgWSwKKwkJCQkJCQkgICBuWSkpOworCVNNVENfd3JpdGUyRHJlZyhERV9ESU1FTlNJT04sCisJCQlGSUVMRF9WQUxVRSgwLCBERV9ESU1FTlNJT04sIFgsCisJCQkgICAgZHN0X3dpZHRoKSB8IEZJRUxEX1ZBTFVFKDAsIERFX0RJTUVOU0lPTiwKKwkJCQkJCSAgICAgWV9FVCwgMSkpOworCVNNVENfd3JpdGUyRHJlZyhERV9DT05UUk9MLAorCQlGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgU1RBVFVTLCBTVEFSVCkgfCBGSUVMRF9TRVQoMCwKKwkJCQkJCQkgICAgREVfQ09OVFJPTCwKKwkJCQkJCQkgICAgRElSRUNUSU9OLAorCQkJCQkJCSAgICBSSUdIVF9UT19MRUZUKQorCQl8IEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBNQUpPUiwgWCkgfCBGSUVMRF9TRVQoMCwKKwkJCQkJCQkgREVfQ09OVFJPTCwKKwkJCQkJCQkgU1RFUF9YLAorCQkJCQkJCSBQT1NJVElWRSkKKwkJfCBGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgU1RFUF9ZLAorCQkJICAgIE5FR0FUSVZFKSB8IEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLAorCQkJCQkJICBMQVNUX1BJWEVMLAorCQkJCQkJICBPRkYpIHwgRklFTERfU0VUKDAsCisJCQkJCQkJICAgREVfQ09OVFJPTCwKKwkJCQkJCQkgICBDT01NQU5ELAorCQkJCQkJCSAgIFNIT1JUX1NUUk9LRSkKKwkJfCBGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgUk9QX1NFTEVDVCwKKwkJCSAgICBST1AyKSB8IEZJRUxEX1ZBTFVFKDAsIERFX0NPTlRST0wsIFJPUCwKKwkJCQkJCTB4MEMpKTsKKworCXNtdGNfZGVfYnVzeSA9IDE7Cit9CisKK3ZvaWQgZGVMaW5lKHVuc2lnbmVkIGxvbmcgZHN0X2Jhc2UsCisJICAgIHVuc2lnbmVkIGxvbmcgZHN0X3BpdGNoLAorCSAgICB1bnNpZ25lZCBsb25nIG5YMSwKKwkgICAgdW5zaWduZWQgbG9uZyBuWTEsCisJICAgIHVuc2lnbmVkIGxvbmcgblgyLCB1bnNpZ25lZCBsb25nIG5ZMiwgdW5zaWduZWQgbG9uZyBuQ29sb3IpCit7CisJdW5zaWduZWQgbG9uZyBuQ29tbWFuZCA9CisJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBTVEFUVVMsIFNUQVJUKSB8CisJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBESVJFQ1RJT04sIExFRlRfVE9fUklHSFQpIHwKKwkgICAgRklFTERfU0VUKDAsIERFX0NPTlRST0wsIE1BSk9SLCBYKSB8CisJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBTVEVQX1gsIFBPU0lUSVZFKSB8CisJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBTVEVQX1ksIFBPU0lUSVZFKSB8CisJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBMQVNUX1BJWEVMLCBPRkYpIHwKKwkgICAgRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFJPUF9TRUxFQ1QsIFJPUDIpIHwKKwkgICAgRklFTERfVkFMVUUoMCwgREVfQ09OVFJPTCwgUk9QLCAweDBDKTsKKwl1bnNpZ25lZCBsb25nIERlbHRhWDsKKwl1bnNpZ25lZCBsb25nIERlbHRhWTsKKworCS8qIENhbGN1bGF0ZSBkZWx0YSBYICovCisJaWYgKG5YMSA8PSBuWDIpCisJCURlbHRhWCA9IG5YMiAtIG5YMTsKKwllbHNlIHsKKwkJRGVsdGFYID0gblgxIC0gblgyOworCQluQ29tbWFuZCA9IEZJRUxEX1NFVChuQ29tbWFuZCwgREVfQ09OVFJPTCwgU1RFUF9YLCBORUdBVElWRSk7CisJfQorCisJLyogQ2FsY3VsYXRlIGRlbHRhIFkgKi8KKwlpZiAoblkxIDw9IG5ZMikKKwkJRGVsdGFZID0gblkyIC0gblkxOworCWVsc2UgeworCQlEZWx0YVkgPSBuWTEgLSBuWTI7CisJCW5Db21tYW5kID0gRklFTERfU0VUKG5Db21tYW5kLCBERV9DT05UUk9MLCBTVEVQX1ksIE5FR0FUSVZFKTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIG1ham9yIGF4aXMgKi8KKwlpZiAoRGVsdGFYIDwgRGVsdGFZKQorCQluQ29tbWFuZCA9IEZJRUxEX1NFVChuQ29tbWFuZCwgREVfQ09OVFJPTCwgTUFKT1IsIFkpOworCisJLyogVmVydGljYWwgbGluZT8gKi8KKwlpZiAoblgxID09IG5YMikKKwkJZGVWZXJ0aWNhbExpbmUoZHN0X2Jhc2UsIGRzdF9waXRjaCwgblgxLCBuWTEsIERlbHRhWSwgbkNvbG9yKTsKKworCS8qIEhvcml6b250YWwgbGluZT8gKi8KKwllbHNlIGlmIChuWTEgPT0gblkyKQorCQlkZUhvcml6b250YWxMaW5lKGRzdF9iYXNlLCBkc3RfcGl0Y2gsIG5YMSwgblkxLCBcCisJCQkJRGVsdGFYLCBuQ29sb3IpOworCisJLyogRGlhZ29uYWwgbGluZT8gKi8KKwllbHNlIGlmIChEZWx0YVggPT0gRGVsdGFZKSB7CisJCWRlV2FpdEZvck5vdEJ1c3koKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsCisJCQkJRklFTERfVkFMVUUoMCwgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsCisJCQkJCSAgICBBRERSRVNTLCBkc3RfYmFzZSkpOworCisJCVNNVENfd3JpdGUyRHJlZyhERV9QSVRDSCwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgREVTVElOQVRJT04sCisJCQkJCSAgICBkc3RfcGl0Y2gpIHwgRklFTERfVkFMVUUoMCwKKwkJCQkJCQkgICAgIERFX1BJVENILAorCQkJCQkJCSAgICAgU09VUkNFLAorCQkJCQkJCSAgICAgZHN0X3BpdGNoKSk7CisKKwkJU01UQ193cml0ZTJEcmVnKERFX1dJTkRPV19XSURUSCwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfV0lEVEgsIERFU1RJTkFUSU9OLAorCQkJCQkgICAgZHN0X3BpdGNoKSB8IEZJRUxEX1ZBTFVFKDAsCisJCQkJCQkJICAgICBERV9XSU5ET1dfV0lEVEgsCisJCQkJCQkJICAgICBTT1VSQ0UsCisJCQkJCQkJICAgICBkc3RfcGl0Y2gpKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfRk9SRUdST1VORCwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9GT1JFR1JPVU5ELCBDT0xPUiwgbkNvbG9yKSk7CisKKwkJU01UQ193cml0ZTJEcmVnKERFX0RFU1RJTkFUSU9OLAorCQkJCUZJRUxEX1NFVCgwLCBERV9ERVNUSU5BVElPTiwgV1JBUCwgRElTQUJMRSkgfAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX0RFU1RJTkFUSU9OLCBYLCAxKSB8CisJCQkJRklFTERfVkFMVUUoMCwgREVfREVTVElOQVRJT04sIFksIG5ZMSkpOworCisJCVNNVENfd3JpdGUyRHJlZyhERV9ESU1FTlNJT04sCisJCQkJRklFTERfVkFMVUUoMCwgREVfRElNRU5TSU9OLCBYLCAxKSB8CisJCQkJRklFTERfVkFMVUUoMCwgREVfRElNRU5TSU9OLCBZX0VULCBEZWx0YVgpKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfQ09OVFJPTCwKKwkJCQlGSUVMRF9TRVQobkNvbW1hbmQsIERFX0NPTlRST0wsIENPTU1BTkQsCisJCQkJCSAgU0hPUlRfU1RST0tFKSk7CisJfQorCisJLyogR2VuZXJpYyBsaW5lICovCisJZWxzZSB7CisJCXVuc2lnbmVkIGludCBrMSwgazIsIGV0LCB3OworCQlpZiAoRGVsdGFYIDwgRGVsdGFZKSB7CisJCQlrMSA9IDIgKiBEZWx0YVg7CisJCQlldCA9IGsxIC0gRGVsdGFZOworCQkJazIgPSBldCAtIERlbHRhWTsKKwkJCXcgPSBEZWx0YVkgKyAxOworCQl9IGVsc2UgeworCQkJazEgPSAyICogRGVsdGFZOworCQkJZXQgPSBrMSAtIERlbHRhWDsKKwkJCWsyID0gZXQgLSBEZWx0YVg7CisJCQl3ID0gRGVsdGFYICsgMTsKKwkJfQorCisJCWRlV2FpdEZvck5vdEJ1c3koKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsCisJCQkJRklFTERfVkFMVUUoMCwgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsCisJCQkJCSAgICBBRERSRVNTLCBkc3RfYmFzZSkpOworCisJCVNNVENfd3JpdGUyRHJlZyhERV9QSVRDSCwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgREVTVElOQVRJT04sCisJCQkJCSAgICBkc3RfcGl0Y2gpIHwgRklFTERfVkFMVUUoMCwKKwkJCQkJCQkgICAgIERFX1BJVENILAorCQkJCQkJCSAgICAgU09VUkNFLAorCQkJCQkJCSAgICAgZHN0X3BpdGNoKSk7CisKKwkJU01UQ193cml0ZTJEcmVnKERFX1dJTkRPV19XSURUSCwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfV0lEVEgsIERFU1RJTkFUSU9OLAorCQkJCQkgICAgZHN0X3BpdGNoKSB8IEZJRUxEX1ZBTFVFKDAsCisJCQkJCQkJICAgICBERV9XSU5ET1dfV0lEVEgsCisJCQkJCQkJICAgICBTT1VSQ0UsCisJCQkJCQkJICAgICBkc3RfcGl0Y2gpKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfRk9SRUdST1VORCwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9GT1JFR1JPVU5ELCBDT0xPUiwgbkNvbG9yKSk7CisKKwkJU01UQ193cml0ZTJEcmVnKERFX1NPVVJDRSwKKwkJCQlGSUVMRF9TRVQoMCwgREVfU09VUkNFLCBXUkFQLCBESVNBQkxFKSB8CisJCQkJRklFTERfVkFMVUUoMCwgREVfU09VUkNFLCBYX0sxLCBrMSkgfAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1NPVVJDRSwgWV9LMiwgazIpKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfREVTVElOQVRJT04sCisJCQkJRklFTERfU0VUKDAsIERFX0RFU1RJTkFUSU9OLCBXUkFQLCBESVNBQkxFKSB8CisJCQkJRklFTERfVkFMVUUoMCwgREVfREVTVElOQVRJT04sIFgsIG5YMSkgfAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX0RFU1RJTkFUSU9OLCBZLCBuWTEpKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfRElNRU5TSU9OLAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX0RJTUVOU0lPTiwgWCwgdykgfAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX0RJTUVOU0lPTiwgWV9FVCwgZXQpKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfQ09OVFJPTCwKKwkJCQlGSUVMRF9TRVQobkNvbW1hbmQsIERFX0NPTlRST0wsIENPTU1BTkQsCisJCQkJCSAgTElORV9EUkFXKSk7CisJfQorCisJc210Y19kZV9idXN5ID0gMTsKK30KKwordm9pZCBkZUZpbGxSZWN0KHVuc2lnbmVkIGxvbmcgZHN0X2Jhc2UsCisJCXVuc2lnbmVkIGxvbmcgZHN0X3BpdGNoLAorCQl1bnNpZ25lZCBsb25nIGRzdF9YLAorCQl1bnNpZ25lZCBsb25nIGRzdF9ZLAorCQl1bnNpZ25lZCBsb25nIGRzdF93aWR0aCwKKwkJdW5zaWduZWQgbG9uZyBkc3RfaGVpZ2h0LCB1bnNpZ25lZCBsb25nIG5Db2xvcikKK3sKKwlkZVdhaXRGb3JOb3RCdXN5KCk7CisKKwlTTVRDX3dyaXRlMkRyZWcoREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRSwgQUREUkVTUywKKwkJCQkgICAgZHN0X2Jhc2UpKTsKKworCWlmIChkc3RfcGl0Y2gpIHsKKwkJU01UQ193cml0ZTJEcmVnKERFX1BJVENILAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1BJVENILCBERVNUSU5BVElPTiwKKwkJCQkJICAgIGRzdF9waXRjaCkgfCBGSUVMRF9WQUxVRSgwLAorCQkJCQkJCSAgICAgREVfUElUQ0gsCisJCQkJCQkJICAgICBTT1VSQ0UsCisJCQkJCQkJICAgICBkc3RfcGl0Y2gpKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfV0lORE9XX1dJRFRILAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1dJTkRPV19XSURUSCwgREVTVElOQVRJT04sCisJCQkJCSAgICBkc3RfcGl0Y2gpIHwgRklFTERfVkFMVUUoMCwKKwkJCQkJCQkgICAgIERFX1dJTkRPV19XSURUSCwKKwkJCQkJCQkgICAgIFNPVVJDRSwKKwkJCQkJCQkgICAgIGRzdF9waXRjaCkpOworCX0KKworCVNNVENfd3JpdGUyRHJlZyhERV9GT1JFR1JPVU5ELAorCQkJRklFTERfVkFMVUUoMCwgREVfRk9SRUdST1VORCwgQ09MT1IsIG5Db2xvcikpOworCisJU01UQ193cml0ZTJEcmVnKERFX0RFU1RJTkFUSU9OLAorCQkJRklFTERfU0VUKDAsIERFX0RFU1RJTkFUSU9OLCBXUkFQLCBESVNBQkxFKSB8CisJCQlGSUVMRF9WQUxVRSgwLCBERV9ERVNUSU5BVElPTiwgWCwgZHN0X1gpIHwKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX0RFU1RJTkFUSU9OLCBZLCBkc3RfWSkpOworCisJU01UQ193cml0ZTJEcmVnKERFX0RJTUVOU0lPTiwKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX0RJTUVOU0lPTiwgWCwgZHN0X3dpZHRoKSB8CisJCQlGSUVMRF9WQUxVRSgwLCBERV9ESU1FTlNJT04sIFlfRVQsIGRzdF9oZWlnaHQpKTsKKworCVNNVENfd3JpdGUyRHJlZyhERV9DT05UUk9MLAorCQkJRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFNUQVRVUywgU1RBUlQpIHwKKwkJCUZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBESVJFQ1RJT04sIExFRlRfVE9fUklHSFQpIHwKKwkJCUZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBMQVNUX1BJWEVMLCBPRkYpIHwKKwkJCUZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBDT01NQU5ELCBSRUNUQU5HTEVfRklMTCkgfAorCQkJRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFJPUF9TRUxFQ1QsIFJPUDIpIHwKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX0NPTlRST0wsIFJPUCwgMHgwQykpOworCisJc210Y19kZV9idXN5ID0gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBkZVJvdGF0ZVBhdHRlcm4KKyAqCisgKiBQdXJwb3NlCisgKiAgICBSb3RhdGUgdGhlIGdpdmVuIHBhdHRlcm4gaWYgbmVjZXNzYXJ5CisgKgorICogUGFyYW1ldGVycworICogICAgW2luXQorICoJICAgcFBhdHRlcm4gIC0gUG9pbnRlciB0byBERV9TVVJGQUNFIHN0cnVjdHVyZSBjb250YWluaW5nCisgKgkJICAgICAgIHBhdHRlcm4gYXR0cmlidXRlcworICoJICAgcGF0dGVyblggIC0gWCBwb3NpdGlvbiAoMC03KSBvZiBwYXR0ZXJuIG9yaWdpbgorICoJICAgcGF0dGVyblkgIC0gWSBwb3NpdGlvbiAoMC03KSBvZiBwYXR0ZXJuIG9yaWdpbgorICoKKyAqICAgIFtvdXRdCisgKgkgICBwYXR0ZXJuX2RzdGFkZHIgLSBQb2ludGVyIHRvIHByZS1hbGxvY2F0ZWQgYnVmZmVyIGNvbnRhaW5pbmcKKyAqCSAgIHJvdGF0ZWQgcGF0dGVybgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBkZVJvdGF0ZVBhdHRlcm4odW5zaWduZWQgY2hhciAqcGF0dGVybl9kc3RhZGRyLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgcGF0dGVybl9zcmNfYWRkciwKKwkJICAgICB1bnNpZ25lZCBsb25nIHBhdHRlcm5fQlBQLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgcGF0dGVybl9zdHJpZGUsIGludCBwYXR0ZXJuWCwgaW50IHBhdHRlcm5ZKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgcGF0dGVybltQQVRURVJOX1dJRFRIICogUEFUVEVSTl9IRUlHSFRdOworCXVuc2lnbmVkIGludCB4LCB5OworCXVuc2lnbmVkIGNoYXIgKnBqUGF0Qnl0ZTsKKworCWlmIChwYXR0ZXJuX2RzdGFkZHIgIT0gTlVMTCkgeworCQlkZVdhaXRGb3JOb3RCdXN5KCk7CisKKwkJaWYgKHBhdHRlcm5YIHx8IHBhdHRlcm5ZKSB7CisJCQkvKiBSb3RhdGUgcGF0dGVybiAqLworCQkJcGpQYXRCeXRlID0gKHVuc2lnbmVkIGNoYXIgKilwYXR0ZXJuOworCisJCQlzd2l0Y2ggKHBhdHRlcm5fQlBQKSB7CisJCQljYXNlIDg6CisJCQkJeworCQkJCQlmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisJCQkJCQl1bnNpZ25lZCBjaGFyICpwakJ1ZmZlciA9CisJCQkJCQkgICAgcGF0dGVybl9kc3RhZGRyICsKKwkJCQkJCSAgICAoKHBhdHRlcm5ZICsgeSkgJiA3KSAqIDg7CisJCQkJCQlmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisJCQkJCQkJcGpCdWZmZXJbKHBhdHRlcm5YICsKKwkJCQkJCQkJICB4KSAmIDddID0KKwkJCQkJCQkgICAgcGpQYXRCeXRlW3hdOworCQkJCQkJfQorCQkJCQkJcGpQYXRCeXRlICs9IHBhdHRlcm5fc3RyaWRlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSAxNjoKKwkJCQl7CisJCQkJCWZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKwkJCQkJCXVuc2lnbmVkIHNob3J0ICpwakJ1ZmZlciA9CisJCQkJCQkgICAgKHVuc2lnbmVkIHNob3J0ICopCisJCQkJCQkgICAgcGF0dGVybl9kc3RhZGRyICsKKwkJCQkJCSAgICAoKHBhdHRlcm5ZICsgeSkgJiA3KSAqIDg7CisJCQkJCQlmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisJCQkJCQkJcGpCdWZmZXJbKHBhdHRlcm5YICsKKwkJCQkJCQkJICB4KSAmIDddID0KKwkJCQkJCQkgICAgKCh1bnNpZ25lZCBzaG9ydCAqKQorCQkJCQkJCSAgICAgcGpQYXRCeXRlKVt4XTsKKwkJCQkJCX0KKwkJCQkJCXBqUGF0Qnl0ZSArPSBwYXR0ZXJuX3N0cmlkZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgMzI6CisJCQkJeworCQkJCQlmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisJCQkJCQl1bnNpZ25lZCBsb25nICpwakJ1ZmZlciA9CisJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgKikKKwkJCQkJCSAgICBwYXR0ZXJuX2RzdGFkZHIgKworCQkJCQkJICAgICgocGF0dGVyblkgKyB5KSAmIDcpICogODsKKwkJCQkJCWZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKwkJCQkJCQlwakJ1ZmZlclsocGF0dGVyblggKworCQkJCQkJCQkgIHgpICYgN10gPQorCQkJCQkJCSAgICAoKHVuc2lnbmVkIGxvbmcgKikKKwkJCQkJCQkgICAgIHBqUGF0Qnl0ZSlbeF07CisJCQkJCQl9CisJCQkJCQlwalBhdEJ5dGUgKz0gcGF0dGVybl9zdHJpZGU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLypEb24ndCByb3RhdGUsanVzdCBjb3B5IHBhdHRlcm4gaW50byBwYXR0ZXJuX2RzdGFkZHIqLworCQkJZm9yIChpID0gMDsgaSA8IChwYXR0ZXJuX0JQUCAqIDIpOyBpKyspIHsKKwkJCQkoKHVuc2lnbmVkIGxvbmcgKilwYXR0ZXJuX2RzdGFkZHIpW2ldID0KKwkJCQkgICAgcGF0dGVybltpXTsKKwkJCX0KKwkJfQorCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGRlQ29weQorICoKKyAqIFB1cnBvc2UKKyAqICAgIENvcHkgYSByZWN0YW5ndWxhciBhcmVhIG9mIHRoZSBzb3VyY2Ugc3VyZmFjZSB0byBhIGRlc3RpbmF0aW9uIHN1cmZhY2UKKyAqCisgKiBSZW1hcmtzCisgKiAgICBTb3VyY2UgYml0bWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBjb2xvciBkZXB0aCAoQlBQKSBhcyB0aGUgZGVzdGluYXRpb24KKyAqICAgIGJpdG1hcC4KKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBkZUNvcHkodW5zaWduZWQgbG9uZyBkc3RfYmFzZSwKKwkgICAgdW5zaWduZWQgbG9uZyBkc3RfcGl0Y2gsCisJICAgIHVuc2lnbmVkIGxvbmcgZHN0X0JQUCwKKwkgICAgdW5zaWduZWQgbG9uZyBkc3RfWCwKKwkgICAgdW5zaWduZWQgbG9uZyBkc3RfWSwKKwkgICAgdW5zaWduZWQgbG9uZyBkc3Rfd2lkdGgsCisJICAgIHVuc2lnbmVkIGxvbmcgZHN0X2hlaWdodCwKKwkgICAgdW5zaWduZWQgbG9uZyBzcmNfYmFzZSwKKwkgICAgdW5zaWduZWQgbG9uZyBzcmNfcGl0Y2gsCisJICAgIHVuc2lnbmVkIGxvbmcgc3JjX1gsCisJICAgIHVuc2lnbmVkIGxvbmcgc3JjX1ksIHBUcmFuc3BhcmVudCBwVHJhbnNwLCB1bnNpZ25lZCBjaGFyIG5ST1AyKQoreworCXVuc2lnbmVkIGxvbmcgbkRpcmVjdGlvbiA9IDA7CisJdW5zaWduZWQgbG9uZyBuVHJhbnNwYXJlbnQgPSAwOworCS8qIERpcmVjdGlvbiBvZiBST1AyIG9wZXJhdGlvbjoKKwkgKiAxID0gTGVmdCB0byBSaWdodCwKKwkgKiAoLTEpID0gUmlnaHQgdG8gTGVmdAorCSAqLworCXVuc2lnbmVkIGxvbmcgb3BTaWduID0gMTsKKwkvKiB4V2lkdGggaXMgaW4gcGl4ZWxzICovCisJdW5zaWduZWQgbG9uZyB4V2lkdGggPSAxOTIgLyAoZHN0X0JQUCAvIDgpOworCXVuc2lnbmVkIGxvbmcgZGVfY3RybCA9IDA7CisKKwlkZVdhaXRGb3JOb3RCdXN5KCk7CisKKwlTTVRDX3dyaXRlMkRyZWcoREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRSwgQUREUkVTUywKKwkJCQkgICAgZHN0X2Jhc2UpKTsKKworCVNNVENfd3JpdGUyRHJlZyhERV9XSU5ET1dfU09VUkNFX0JBU0UsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfU09VUkNFX0JBU0UsIEFERFJFU1MsCisJCQkJICAgIHNyY19iYXNlKSk7CisKKwlpZiAoZHN0X3BpdGNoICYmIHNyY19waXRjaCkgeworCQlTTVRDX3dyaXRlMkRyZWcoREVfUElUQ0gsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgREVTVElOQVRJT04sCisJCQkJICAgIGRzdF9waXRjaCkgfCBGSUVMRF9WQUxVRSgwLAorCQkJCQkJICAgICBERV9QSVRDSCwKKwkJCQkJCSAgICAgU09VUkNFLAorCQkJCQkJICAgICBzcmNfcGl0Y2gpKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfV0lORE9XX1dJRFRILAorCQkJRklFTERfVkFMVUUoMCwgREVfV0lORE9XX1dJRFRILCBERVNUSU5BVElPTiwKKwkJCQkgICAgZHN0X3BpdGNoKSB8IEZJRUxEX1ZBTFVFKDAsCisJCQkJCQkgICAgIERFX1dJTkRPV19XSURUSCwKKwkJCQkJCSAgICAgU09VUkNFLAorCQkJCQkJICAgICBzcmNfcGl0Y2gpKTsKKwl9CisKKwkvKiBTZXQgdHJhbnNwYXJlbnQgYml0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAocFRyYW5zcCAhPSBOVUxMKSB7CisJCW5UcmFuc3BhcmVudCA9CisJCSAgICBwVHJhbnNwLT5tYXRjaCB8IHBUcmFuc3AtPnNlbGVjdCB8IHBUcmFuc3AtPmNvbnRyb2w7CisKKwkJLyogU2V0IGNvbG9yIGNvbXBhcmUgcmVnaXN0ZXIgKi8KKwkJU01UQ193cml0ZTJEcmVnKERFX0NPTE9SX0NPTVBBUkUsCisJCQkJRklFTERfVkFMVUUoMCwgREVfQ09MT1JfQ09NUEFSRSwgQ09MT1IsCisJCQkJCSAgICBwVHJhbnNwLT5jb2xvcikpOworCX0KKworCS8qIERldGVybWluZSBkaXJlY3Rpb24gb2Ygb3BlcmF0aW9uICovCisJaWYgKHNyY19ZIDwgZHN0X1kpIHsKKwkJLyogKy0tLS0tLS0tLS0rCisJCSAgIHxTICAgICAgICAgfAorCQkgICB8ICAgICAgICAgICstLS0tLS0tLS0tKworCQkgICB8ICAgICAgICAgIHwgICAgICB8ICAgfAorCQkgICB8ICAgICAgICAgIHwgICAgICB8ICAgfAorCQkgICArLS0tfC0tLS0tLSsgICAgICB8CisJCSAgIHwgICAgICAgICAgICAgICBEIHwKKwkJICAgKy0tLS0tLS0tLS0rICovCisKKwkJbkRpcmVjdGlvbiA9IEJPVFRPTV9UT19UT1A7CisJfSBlbHNlIGlmIChzcmNfWSA+IGRzdF9ZKSB7CisJCS8qICstLS0tLS0tLS0tKworCQkgICB8RCAgICAgICAgIHwKKwkJICAgfCAgICAgICAgICArLS0tLS0tLS0tLSsKKwkJICAgfCAgICAgICAgICB8ICAgICAgfCAgIHwKKwkJICAgfCAgICAgICAgICB8ICAgICAgfCAgIHwKKwkJICAgKy0tLXwtLS0tLS0rICAgICAgfAorCQkgICB8ICAgICAgICAgICAgICAgUyB8CisJCSAgICstLS0tLS0tLS0tKyAqLworCisJCW5EaXJlY3Rpb24gPSBUT1BfVE9fQk9UVE9NOworCX0gZWxzZSB7CisJCS8qIHNyY19ZID09IGRzdF9ZICovCisKKwkJaWYgKHNyY19YIDw9IGRzdF9YKSB7CisJCQkvKiArLS0tLS0tKy0tLSstLS0tLS0rCisJCQkgICB8UyAgICAgfCAgIHwgICAgIER8CisJCQkgICB8ICAgICAgfCAgIHwgICAgICB8CisJCQkgICB8ICAgICAgfCAgIHwgICAgICB8CisJCQkgICB8ICAgICAgfCAgIHwgICAgICB8CisJCQkgICArLS0tLS0tKy0tLSstLS0tLS0rICovCisKKwkJCW5EaXJlY3Rpb24gPSBSSUdIVF9UT19MRUZUOworCQl9IGVsc2UgeworCQkJLyogc3JjX1ggPiBkc3RfWCAqLworCisJCQkvKiArLS0tLS0tKy0tLSstLS0tLS0rCisJCQkgICB8RCAgICAgfCAgIHwgICAgIFN8CisJCQkgICB8ICAgICAgfCAgIHwgICAgICB8CisJCQkgICB8ICAgICAgfCAgIHwgICAgICB8CisJCQkgICB8ICAgICAgfCAgIHwgICAgICB8CisJCQkgICArLS0tLS0tKy0tLSstLS0tLS0rICovCisKKwkJCW5EaXJlY3Rpb24gPSBMRUZUX1RPX1JJR0hUOworCQl9CisJfQorCisJaWYgKChuRGlyZWN0aW9uID09IEJPVFRPTV9UT19UT1ApIHx8IChuRGlyZWN0aW9uID09IFJJR0hUX1RPX0xFRlQpKSB7CisJCXNyY19YICs9IGRzdF93aWR0aCAtIDE7CisJCXNyY19ZICs9IGRzdF9oZWlnaHQgLSAxOworCQlkc3RfWCArPSBkc3Rfd2lkdGggLSAxOworCQlkc3RfWSArPSBkc3RfaGVpZ2h0IC0gMTsKKwkJb3BTaWduID0gKC0xKTsKKwl9CisKKwlpZiAoZHN0X0JQUCA+PSAyNCkgeworCQlzcmNfWCAqPSAzOworCQlzcmNfWSAqPSAzOworCQlkc3RfWCAqPSAzOworCQlkc3RfWSAqPSAzOworCQlkc3Rfd2lkdGggKj0gMzsKKwkJaWYgKChuRGlyZWN0aW9uID09IEJPVFRPTV9UT19UT1ApCisJCSAgICB8fCAobkRpcmVjdGlvbiA9PSBSSUdIVF9UT19MRUZUKSkgeworCQkJc3JjX1ggKz0gMjsKKwkJCWRzdF9YICs9IDI7CisJCX0KKwl9CisKKwkvKiBXb3JrYXJvdW5kIGZvciAxOTIgYnl0ZSBodyBidWcgKi8KKwlpZiAoKG5ST1AyICE9IDB4MEMpICYmICgoZHN0X3dpZHRoICogKGRzdF9CUFAgLyA4KSkgPj0gMTkyKSkgeworCQkvKgorCQkgKiBQZXJmb3JtIHRoZSBST1AyIG9wZXJhdGlvbiBpbiBjaHVua3Mgb2YgKHhXaWR0aCAqCisJCSAqIGRzdF9oZWlnaHQpCisJCSAqLworCQl3aGlsZSAoMSkgeworCQkJZGVXYWl0Rm9yTm90QnVzeSgpOworCisJCQlTTVRDX3dyaXRlMkRyZWcoREVfU09VUkNFLAorCQkJCUZJRUxEX1NFVCgwLCBERV9TT1VSQ0UsIFdSQVAsIERJU0FCTEUpIHwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9TT1VSQ0UsIFhfSzEsIHNyY19YKSB8CisJCQkJRklFTERfVkFMVUUoMCwgREVfU09VUkNFLCBZX0syLCBzcmNfWSkpOworCisJCQlTTVRDX3dyaXRlMkRyZWcoREVfREVTVElOQVRJT04sCisJCQkJRklFTERfU0VUKDAsIERFX0RFU1RJTkFUSU9OLCBXUkFQLAorCQkJCSAgRElTQUJMRSkgfCBGSUVMRF9WQUxVRSgwLAorCQkJCQkJCSBERV9ERVNUSU5BVElPTiwKKwkJCQkJCQkgWCwKKwkJCQkJCQkgZHN0X1gpCisJCQl8IEZJRUxEX1ZBTFVFKDAsIERFX0RFU1RJTkFUSU9OLCBZLAorCQkJCQkJICAgICAgZHN0X1kpKTsKKworCQkJU01UQ193cml0ZTJEcmVnKERFX0RJTUVOU0lPTiwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9ESU1FTlNJT04sIFgsCisJCQkJICAgIHhXaWR0aCkgfCBGSUVMRF9WQUxVRSgwLAorCQkJCQkJCSAgREVfRElNRU5TSU9OLAorCQkJCQkJCSAgWV9FVCwKKwkJCQkJCQkgIGRzdF9oZWlnaHQpKTsKKworCQkJZGVfY3RybCA9CisJCQkgICAgRklFTERfVkFMVUUoMCwgREVfQ09OVFJPTCwgUk9QLAorCQkJCW5ST1AyKSB8IG5UcmFuc3BhcmVudCB8IEZJRUxEX1NFVCgwLAorCQkJCQkJCSAgREVfQ09OVFJPTCwKKwkJCQkJCQkgIFJPUF9TRUxFQ1QsCisJCQkJCQkJICBST1AyKQorCQkJICAgIHwgRklFTERfU0VUKDAsIERFX0NPTlRST0wsIENPTU1BTkQsCisJCQkJQklUQkxUKSB8ICgobkRpcmVjdGlvbiA9PQorCQkJCQkgICAgMSkgPyBGSUVMRF9TRVQoMCwKKwkJCQkJCSAgIERFX0NPTlRST0wsCisJCQkJCQkgICBESVJFQ1RJT04sCisJCQkJCQkgICBSSUdIVF9UT19MRUZUKQorCQkJCQkgICA6IEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLAorCQkJCQkgICAgICAgRElSRUNUSU9OLAorCQkJCQkgICAgICAgTEVGVF9UT19SSUdIVCkpIHwKKwkJCSAgICBGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgU1RBVFVTLCBTVEFSVCk7CisKKwkJCVNNVENfd3JpdGUyRHJlZyhERV9DT05UUk9MLCBkZV9jdHJsKTsKKworCQkJc3JjX1ggKz0gKG9wU2lnbiAqIHhXaWR0aCk7CisJCQlkc3RfWCArPSAob3BTaWduICogeFdpZHRoKTsKKwkJCWRzdF93aWR0aCAtPSB4V2lkdGg7CisKKwkJCWlmIChkc3Rfd2lkdGggPD0gMCkgeworCQkJCS8qIFJPUDIgb3BlcmF0aW9uIGlzIGNvbXBsZXRlICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICh4V2lkdGggPiBkc3Rfd2lkdGgpCisJCQkJeFdpZHRoID0gZHN0X3dpZHRoOworCQl9CisJfSBlbHNlIHsKKwkJZGVXYWl0Rm9yTm90QnVzeSgpOworCQlTTVRDX3dyaXRlMkRyZWcoREVfU09VUkNFLAorCQkJRklFTERfU0VUKDAsIERFX1NPVVJDRSwgV1JBUCwgRElTQUJMRSkgfAorCQkJRklFTERfVkFMVUUoMCwgREVfU09VUkNFLCBYX0sxLCBzcmNfWCkgfAorCQkJRklFTERfVkFMVUUoMCwgREVfU09VUkNFLCBZX0syLCBzcmNfWSkpOworCisJCVNNVENfd3JpdGUyRHJlZyhERV9ERVNUSU5BVElPTiwKKwkJCUZJRUxEX1NFVCgwLCBERV9ERVNUSU5BVElPTiwgV1JBUCwgRElTQUJMRSkgfAorCQkJRklFTERfVkFMVUUoMCwgREVfREVTVElOQVRJT04sIFgsIGRzdF9YKSB8CisJCQlGSUVMRF9WQUxVRSgwLCBERV9ERVNUSU5BVElPTiwgWSwgZHN0X1kpKTsKKworCQlTTVRDX3dyaXRlMkRyZWcoREVfRElNRU5TSU9OLAorCQkJRklFTERfVkFMVUUoMCwgREVfRElNRU5TSU9OLCBYLCBkc3Rfd2lkdGgpIHwKKwkJCUZJRUxEX1ZBTFVFKDAsIERFX0RJTUVOU0lPTiwgWV9FVCwgZHN0X2hlaWdodCkpOworCisJCWRlX2N0cmwgPSBGSUVMRF9WQUxVRSgwLCBERV9DT05UUk9MLCBST1AsIG5ST1AyKSB8CisJCSAgICBuVHJhbnNwYXJlbnQgfAorCQkgICAgRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFJPUF9TRUxFQ1QsIFJPUDIpIHwKKwkJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBDT01NQU5ELCBCSVRCTFQpIHwKKwkJICAgICgobkRpcmVjdGlvbiA9PSAxKSA/IEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBESVJFQ1RJT04sCisJCQkJCQkgICBSSUdIVF9UT19MRUZUKQorCQkgICAgIDogRklFTERfU0VUKDAsIERFX0NPTlRST0wsIERJUkVDVElPTiwKKwkJCQkgTEVGVF9UT19SSUdIVCkpIHwgRklFTERfU0VUKDAsIERFX0NPTlRST0wsCisJCQkJCQkJICAgICBTVEFUVVMsIFNUQVJUKTsKKwkJU01UQ193cml0ZTJEcmVnKERFX0NPTlRST0wsIGRlX2N0cmwpOworCX0KKworCXNtdGNfZGVfYnVzeSA9IDE7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBpeGVsIGZvcm1hdCB0aGF0IHdpbGwgYXBwbHkgdG8gdGhlIDJEIEVuZ2luZS4KKyAqLwordm9pZCBkZVNldFBpeGVsRm9ybWF0KHVuc2lnbmVkIGxvbmcgYnBwKQoreworCXVuc2lnbmVkIGxvbmcgZGVfZm9ybWF0OworCisJZGVfZm9ybWF0ID0gU01UQ19yZWFkMkRyZWcoREVfU1RSRVRDSF9GT1JNQVQpOworCisJc3dpdGNoIChicHApIHsKKwljYXNlIDg6CisJCWRlX2Zvcm1hdCA9CisJCSAgICBGSUVMRF9TRVQoZGVfZm9ybWF0LCBERV9TVFJFVENIX0ZPUk1BVCwgUElYRUxfRk9STUFULCA4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIDE2OgorCQlkZV9mb3JtYXQgPQorCQkgICAgRklFTERfU0VUKGRlX2Zvcm1hdCwgREVfU1RSRVRDSF9GT1JNQVQsIFBJWEVMX0ZPUk1BVCwgMTYpOworCQlicmVhazsKKwljYXNlIDMyOgorCQlkZV9mb3JtYXQgPQorCQkgICAgRklFTERfU0VUKGRlX2Zvcm1hdCwgREVfU1RSRVRDSF9GT1JNQVQsIFBJWEVMX0ZPUk1BVCwgMzIpOworCQlicmVhazsKKwl9CisKKwlTTVRDX3dyaXRlMkRyZWcoREVfU1RSRVRDSF9GT1JNQVQsIGRlX2Zvcm1hdCk7Cit9CisKKy8qCisgKiBTeXN0ZW0gbWVtb3J5IHRvIFZpZGVvIG1lbW9yeSBtb25vY2hyb21lIGV4cGFuc2lvbi4KKyAqCisgKiBTb3VyY2UgaXMgbW9ub2Nocm9tZSBpbWFnZSBpbiBzeXN0ZW0gbWVtb3J5LiAgVGhpcyBmdW5jdGlvbiBleHBhbmRzIHRoZQorICogbW9ub2Nocm9tZSBkYXRhIHRvIGNvbG9yIGltYWdlIGluIHZpZGVvIG1lbW9yeS4KKyAqLworCitsb25nIGRlU3lzdGVtTWVtMlZpZGVvTWVtTW9ub0JsdChjb25zdCBjaGFyICpwU3JjYnVmLAorCQkJCSBsb25nIHNyY0RlbHRhLAorCQkJCSB1bnNpZ25lZCBsb25nIHN0YXJ0Qml0LAorCQkJCSB1bnNpZ25lZCBsb25nIGRCYXNlLAorCQkJCSB1bnNpZ25lZCBsb25nIGRQaXRjaCwKKwkJCQkgdW5zaWduZWQgbG9uZyBicHAsCisJCQkJIHVuc2lnbmVkIGxvbmcgZHgsIHVuc2lnbmVkIGxvbmcgZHksCisJCQkJIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LAorCQkJCSB1bnNpZ25lZCBsb25nIGZDb2xvciwKKwkJCQkgdW5zaWduZWQgbG9uZyBiQ29sb3IsCisJCQkJIHVuc2lnbmVkIGxvbmcgcm9wMikgeworCXVuc2lnbmVkIGxvbmcgYnl0ZVBlclBpeGVsOworCXVuc2lnbmVkIGxvbmcgdWxCeXRlc1BlclNjYW47CisJdW5zaWduZWQgbG9uZyB1bDRCeXRlc1BlclNjYW47CisJdW5zaWduZWQgbG9uZyB1bEJ5dGVzUmVtYWluOworCXVuc2lnbmVkIGxvbmcgZGVfY3RybCA9IDA7CisJdW5zaWduZWQgY2hhciBhalJlbWFpbls0XTsKKwlsb25nIGksIGo7CisKKwlieXRlUGVyUGl4ZWwgPSBicHAgLyA4OworCisJLyogSnVzdCBtYWtlIHN1cmUgdGhlIHN0YXJ0IGJpdCBpcyB3aXRoaW4gbGVnYWwgcmFuZ2UgKi8KKwlzdGFydEJpdCAmPSA3OworCisJdWxCeXRlc1BlclNjYW4gPSAod2lkdGggKyBzdGFydEJpdCArIDcpIC8gODsKKwl1bDRCeXRlc1BlclNjYW4gPSB1bEJ5dGVzUGVyU2NhbiAmIH4zOworCXVsQnl0ZXNSZW1haW4gPSB1bEJ5dGVzUGVyU2NhbiAmIDM7CisKKwlpZiAoc210Y19kZV9idXN5KQorCQlkZVdhaXRGb3JOb3RCdXN5KCk7CisKKwkvKgorCSAqIDJEIFNvdXJjZSBCYXNlLiAgVXNlIDAgZm9yIEhPU1QgQmx0LgorCSAqLworCisJU01UQ193cml0ZTJEcmVnKERFX1dJTkRPV19TT1VSQ0VfQkFTRSwgMCk7CisKKwkvKgorCSAqIDJEIERlc3RpbmF0aW9uIEJhc2UuCisJICoKKwkgKiBJdCBpcyBhbiBhZGRyZXNzIG9mZnNldCAoMTI4IGJpdCBhbGlnbmVkKSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKKwkgKiBmcmFtZSBidWZmZXIuCisJICovCisKKwlTTVRDX3dyaXRlMkRyZWcoREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsIGRCYXNlKTsKKworCWlmIChkUGl0Y2gpIHsKKworCQkvKgorCQkgKiBQcm9ncmFtIHBpdGNoIChkaXN0YW5jZSBiZXR3ZWVuIHRoZSAxc3QgcG9pbnRzIG9mIHR3bworCQkgKiBhZGphY2VudCBsaW5lcykuCisJCSAqCisJCSAqIE5vdGUgdGhhdCBpbnB1dCBwaXRjaCBpcyBCWVRFIHZhbHVlLCBidXQgdGhlIDJEIFBpdGNoCisJCSAqIHJlZ2lzdGVyIHVzZXMgcGl4ZWwgdmFsdWVzLiBOZWVkIEJ5dGUgdG8gcGl4ZWwgY29udmVydGlvbi4KKwkJICovCisKKwkJU01UQ193cml0ZTJEcmVnKERFX1BJVENILAorCQkJRklFTERfVkFMVUUoMCwgREVfUElUQ0gsIERFU1RJTkFUSU9OLAorCQkJICAgIGRQaXRjaCAvCisJCQkgICAgYnl0ZVBlclBpeGVsKSB8IEZJRUxEX1ZBTFVFKDAsCisJCQkJCQkJREVfUElUQ0gsCisJCQkJCQkJU09VUkNFLAorCQkJCQkJCWRQaXRjaCAvCisJCQkJCQkJYnl0ZVBlclBpeGVsKSk7CisKKwkJLyogU2NyZWVuIFdpbmRvdyB3aWR0aCBpbiBQaXhlbHMuCisJCSAqCisJCSAqIDJEIGVuZ2luZSB1c2VzIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgYWRkcmVzcyBpbgorCQkgKiBmcmFtZSBidWZmZXIgZm9yIGEgZ2l2ZW4gcG9pbnQuCisJCSAqLworCisJCVNNVENfd3JpdGUyRHJlZyhERV9XSU5ET1dfV0lEVEgsCisJCQlGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfV0lEVEgsIERFU1RJTkFUSU9OLAorCQkJICAgIChkUGl0Y2ggLworCQkJICAgICBieXRlUGVyUGl4ZWwpKSB8IEZJRUxEX1ZBTFVFKDAsCisJCQkJCQkJICBERV9XSU5ET1dfV0lEVEgsCisJCQkJCQkJICBTT1VSQ0UsCisJCQkJCQkJICAoZFBpdGNoCisJCQkJCQkJICAgLworCQkJCQkJCSAgIGJ5dGVQZXJQaXhlbCkpKTsKKwl9CisJLyogTm90ZTogRm9yIDJEIFNvdXJjZSBpbiBIb3N0IFdyaXRlLCBvbmx5IFhfSzEgZmllbGQgaXMgbmVlZGVkLCBhbmQKKwkgKiBZX0syIGZpZWxkIGlzIG5vdCB1c2VkLiBGb3IgbW9ubyBiaXRtYXAsIHVzZSBzdGFydEJpdCBmb3IgWF9LMS4KKwkgKi8KKworCVNNVENfd3JpdGUyRHJlZyhERV9TT1VSQ0UsCisJCQlGSUVMRF9TRVQoMCwgREVfU09VUkNFLCBXUkFQLCBESVNBQkxFKSB8CisJCQlGSUVMRF9WQUxVRSgwLCBERV9TT1VSQ0UsIFhfSzEsIHN0YXJ0Qml0KSB8CisJCQlGSUVMRF9WQUxVRSgwLCBERV9TT1VSQ0UsIFlfSzIsIDApKTsKKworCVNNVENfd3JpdGUyRHJlZyhERV9ERVNUSU5BVElPTiwKKwkJCUZJRUxEX1NFVCgwLCBERV9ERVNUSU5BVElPTiwgV1JBUCwgRElTQUJMRSkgfAorCQkJRklFTERfVkFMVUUoMCwgREVfREVTVElOQVRJT04sIFgsIGR4KSB8CisJCQlGSUVMRF9WQUxVRSgwLCBERV9ERVNUSU5BVElPTiwgWSwgZHkpKTsKKworCVNNVENfd3JpdGUyRHJlZyhERV9ESU1FTlNJT04sCisJCQlGSUVMRF9WQUxVRSgwLCBERV9ESU1FTlNJT04sIFgsIHdpZHRoKSB8CisJCQlGSUVMRF9WQUxVRSgwLCBERV9ESU1FTlNJT04sIFlfRVQsIGhlaWdodCkpOworCisJU01UQ193cml0ZTJEcmVnKERFX0ZPUkVHUk9VTkQsIGZDb2xvcik7CisJU01UQ193cml0ZTJEcmVnKERFX0JBQ0tHUk9VTkQsIGJDb2xvcik7CisKKwlpZiAoYnBwKQorCQlkZVNldFBpeGVsRm9ybWF0KGJwcCk7CisJLyogU2V0IHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIGRlc3RpbmF0aW9uICovCisKKwlkZV9jdHJsID0gRklFTERfVkFMVUUoMCwgREVfQ09OVFJPTCwgUk9QLCByb3AyKSB8CisJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBST1BfU0VMRUNULCBST1AyKSB8CisJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBDT01NQU5ELCBIT1NUX1dSSVRFKSB8CisJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBIT1NULCBNT05PKSB8CisJICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBTVEFUVVMsIFNUQVJUKTsKKworCVNNVENfd3JpdGUyRHJlZyhERV9DT05UUk9MLCBkZV9jdHJsIHwgZGVHZXRUcmFuc3BhcmVuY3koKSk7CisKKwkvKiBXcml0ZSBNT05PIGRhdGEgKGxpbmUgYnkgbGluZSkgdG8gMkQgRW5naW5lIGRhdGEgcG9ydCAqLworCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworCQkvKiBGb3IgZWFjaCBsaW5lLCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcyBvZiA0IGJ5dGVzICovCisJCWZvciAoaiA9IDA7IGogPCAodWw0Qnl0ZXNQZXJTY2FuIC8gNCk7IGorKykKKwkJCVNNVENfd3JpdGUyRGRhdGFwb3J0KDAsCisJCQkJCSAgICAgKih1bnNpZ25lZCBsb25nICopKHBTcmNidWYgKworCQkJCQkJCQkoaiAqIDQpKSk7CisKKwkJaWYgKHVsQnl0ZXNSZW1haW4pIHsKKwkJCW1lbWNweShhalJlbWFpbiwgcFNyY2J1ZiArIHVsNEJ5dGVzUGVyU2NhbiwKKwkJCSAgICAgICB1bEJ5dGVzUmVtYWluKTsKKwkJCVNNVENfd3JpdGUyRGRhdGFwb3J0KDAsICoodW5zaWduZWQgbG9uZyAqKWFqUmVtYWluKTsKKwkJfQorCisJCXBTcmNidWYgKz0gc3JjRGVsdGE7CisJfQorCXNtdGNfZGVfYnVzeSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgdHJhbnNwYXJlbmN5IHN0YXR1cyBmcm9tIERFX0NPTlRST0wgcmVnaXN0ZXIuCisgKiBJdCByZXR1cm5zIGEgZG91YmxlIHdvcmQgd2l0aCB0aGUgdHJhbnNwYXJlbnQgZmllbGRzIHByb3Blcmx5IHNldCwKKyAqIHdoaWxlIG90aGVyIGZpZWxkcyBhcmUgMC4KKyAqLwordW5zaWduZWQgbG9uZyBkZUdldFRyYW5zcGFyZW5jeSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZGVfY3RybDsKKworCWRlX2N0cmwgPSBTTVRDX3JlYWQyRHJlZyhERV9DT05UUk9MKTsKKworCWRlX2N0cmwgJj0KKwkgICAgRklFTERfTUFTSyhERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9NQVRDSCkgfAorCSAgICBGSUVMRF9NQVNLKERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX1NFTEVDVCkgfAorCSAgICBGSUVMRF9NQVNLKERFX0NPTlRST0xfVFJBTlNQQVJFTkNZKTsKKworCXJldHVybiBkZV9jdHJsOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGMyZC5oIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGMyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZDBjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210YzJkLmgKQEAgLTAsMCArMSw1MzAgQEAKKy8qCisgKiBTaWxpY29uIE1vdGlvbiBTTTcxMiAyRCBkcmF3aW5nIGVuZ2luZSBmdW5jdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbGljb24gTW90aW9uIFRlY2hub2xvZ3kgQ29ycC4KKyAqIEF1dGhvcjogR2UgV2FuZywgZ2V3YW5nQHNpbGljb25tb3Rpb24uY29tCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IExlbW90ZSwgSW5jLgorICogQXV0aG9yOiBXdSBaaGFuZ2ppbiwgd3V6akBsZW1vdGUuY29tCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwJIDAKKyNlbmRpZgorCisvKiBJbnRlcm5hbCBtYWNyb3MgKi8KKworI2RlZmluZSBfRl9TVEFSVChmKQkJKDAgPyBmKQorI2RlZmluZSBfRl9FTkQoZikJCSgxID8gZikKKyNkZWZpbmUgX0ZfU0laRShmKQkJKDEgKyBfRl9FTkQoZikgLSBfRl9TVEFSVChmKSkKKyNkZWZpbmUgX0ZfTUFTSyhmKQkJKCgoMVVMTCA8PCBfRl9TSVpFKGYpKSAtIDEpIDw8IF9GX1NUQVJUKGYpKQorI2RlZmluZSBfRl9OT1JNQUxJWkUodiwgZikJKCgodikgJiBfRl9NQVNLKGYpKSA+PiBfRl9TVEFSVChmKSkKKyNkZWZpbmUgX0ZfREVOT1JNQUxJWkUodiwgZikJKCgodikgPDwgX0ZfU1RBUlQoZikpICYgX0ZfTUFTSyhmKSkKKworLyogR2xvYmFsIG1hY3JvcyAqLworCisjZGVmaW5lIEZJRUxEX0dFVCh4LCByZWcsIGZpZWxkKSBcCisoIFwKKyAgICBfRl9OT1JNQUxJWkUoKHgpLCByZWcgIyMgXyAjIyBmaWVsZCkgXAorKQorCisjZGVmaW5lIEZJRUxEX1NFVCh4LCByZWcsIGZpZWxkLCB2YWx1ZSkgXAorKCBcCisgICAgKHggJiB+X0ZfTUFTSyhyZWcgIyMgXyAjIyBmaWVsZCkpIFwKKyAgICB8IF9GX0RFTk9STUFMSVpFKHJlZyAjIyBfICMjIGZpZWxkICMjIF8gIyMgdmFsdWUsIHJlZyAjIyBfICMjIGZpZWxkKSBcCispCisKKyNkZWZpbmUgRklFTERfVkFMVUUoeCwgcmVnLCBmaWVsZCwgdmFsdWUpIFwKKyggXAorICAgICh4ICYgfl9GX01BU0socmVnICMjIF8gIyMgZmllbGQpKSBcCisgICAgfCBfRl9ERU5PUk1BTElaRSh2YWx1ZSwgcmVnICMjIF8gIyMgZmllbGQpIFwKKykKKworI2RlZmluZSBGSUVMRF9DTEVBUihyZWcsIGZpZWxkKSBcCisoIFwKKyAgICB+X0ZfTUFTSyhyZWcgIyMgXyAjIyBmaWVsZCkgXAorKQorCisvKiBGaWVsZCBNYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEZJRUxEX1NUQVJUKGZpZWxkKQkoMCA/IGZpZWxkKQorI2RlZmluZSBGSUVMRF9FTkQoZmllbGQpCSgxID8gZmllbGQpCisjZGVmaW5lIEZJRUxEX1NJWkUoZmllbGQpIFwKKwkoMSArIEZJRUxEX0VORChmaWVsZCkgLSBGSUVMRF9TVEFSVChmaWVsZCkpCisKKyNkZWZpbmUgRklFTERfTUFTSyhmaWVsZCkgXAorCSgoKDEgPDwgKEZJRUxEX1NJWkUoZmllbGQpLTEpKSBcCisJfCAoKDEgPDwgKEZJRUxEX1NJWkUoZmllbGQpLTEpKSAtIDEpKSBcCisJPDwgRklFTERfU1RBUlQoZmllbGQpKQorCisjZGVmaW5lIEZJRUxEX05PUk1BTElaRShyZWcsIGZpZWxkKSBcCisJKCgocmVnKSAmIEZJRUxEX01BU0soZmllbGQpKSA+PiBGSUVMRF9TVEFSVChmaWVsZCkpCisKKyNkZWZpbmUgRklFTERfREVOT1JNQUxJWkUoZmllbGQsIHZhbHVlKSBcCisJKCgodmFsdWUpIDw8IEZJRUxEX1NUQVJUKGZpZWxkKSkgJiBGSUVMRF9NQVNLKGZpZWxkKSkKKworI2RlZmluZSBGSUVMRF9JTklUKHJlZywgZmllbGQsIHZhbHVlKSBcCisJRklFTERfREVOT1JNQUxJWkUocmVnICMjIF8gIyMgZmllbGQsIFwKKwkJcmVnICMjIF8gIyMgZmllbGQgIyMgXyAjIyB2YWx1ZSkKKworI2RlZmluZSBGSUVMRF9JTklUX1ZBTChyZWcsIGZpZWxkLCB2YWx1ZSkgXAorCShGSUVMRF9ERU5PUk1BTElaRShyZWcgIyMgXyAjIyBmaWVsZCwgdmFsdWUpKQorCisjZGVmaW5lIEZJRUxEX1ZBTF9TRVQoeCwgciwgZiwgdikgKHsgXAorCXggPSAoeCAmIH5GSUVMRF9NQVNLKHIgIyMgXyAjIyBmKSkgXAorCXwgRklFTERfREVOT1JNQUxJWkUociAjIyBfICMjIGYsIHIgIyMgXyAjIyBmICMjIF8gIyMgdikgXAorfSkKKworI2RlZmluZSBSR0IociwgZywgYikJKCh1bnNpZ25lZCBsb25nKSgoKHIpIDw8IDE2KSB8ICgoZykgPDwgOCkgfCAoYikpKQorCisvKiBUcmFuc3BhcmVudCBpbmZvIGRlZmluaXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1hdGNoOwkvKiBNYXRjaGluZyBwaXhlbCBpcyBPUEFRVUUvVFJBTlNQQVJFTlQgKi8KKwl1bnNpZ25lZCBsb25nIHNlbGVjdDsJLyogVHJhbnNwYXJlbmN5IGNvbnRyb2xsZWQgYnkgU1JDL0RTVCAqLworCXVuc2lnbmVkIGxvbmcgY29udHJvbDsJLyogRU5BQkxFL0RJU0FCTEUgdHJhbnNwYXJlbmN5ICovCisJdW5zaWduZWQgbG9uZyBjb2xvcjsJLyogVHJhbnNwYXJlbnQgY29sb3IgKi8KK30gVHJhbnNwYXJlbnQsICpwVHJhbnNwYXJlbnQ7CisKKyNkZWZpbmUgUElYRUxfREVQVEhfMV9CUAkwCS8qIDEgYml0IHBlciBwaXhlbCAqLworI2RlZmluZSBQSVhFTF9ERVBUSF84X0JQUAkxCS8qIDggYml0cyBwZXIgcGl4ZWwgKi8KKyNkZWZpbmUgUElYRUxfREVQVEhfMTZfQlBQCTIJLyogMTYgYml0cyBwZXIgcGl4ZWwgKi8KKyNkZWZpbmUgUElYRUxfREVQVEhfMzJfQlBQCTMJLyogMzIgYml0cyBwZXIgcGl4ZWwgKi8KKyNkZWZpbmUgUElYRUxfREVQVEhfWVVWNDIyCTgJLyogMTYgYml0cyBwZXIgcGl4ZWwgWVVWNDIyICovCisjZGVmaW5lIFBJWEVMX0RFUFRIX1lVVjQyMAk5CS8qIDE2IGJpdHMgcGVyIHBpeGVsIFlVVjQyMCAqLworCisjZGVmaW5lIFBBVFRFUk5fV0lEVEgJCTgKKyNkZWZpbmUgUEFUVEVSTl9IRUlHSFQJCTgKKworI2RlZmluZQlUT1BfVE9fQk9UVE9NCQkwCisjZGVmaW5lCUJPVFRPTV9UT19UT1AJCTEKKyNkZWZpbmUgUklHSFRfVE9fTEVGVAkJQk9UVE9NX1RPX1RPUAorI2RlZmluZSBMRUZUX1RPX1JJR0hUCQlUT1BfVE9fQk9UVE9NCisKKy8qIENvbnN0YW50cyB1c2VkIGluIFRyYW5zcGFyZW50IHN0cnVjdHVyZSAqLworI2RlZmluZSBNQVRDSF9PUEFRVUUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUFUQ0hfVFJBTlNQQVJFTlQJMHgwMDAwMDQwMAorI2RlZmluZSBTT1VSQ0UJCQkweDAwMDAwMDAwCisjZGVmaW5lIERFU1RJTkFUSU9OCQkweDAwMDAwMjAwCisKKy8qIDJEIHJlZ2lzdGVycy4gKi8KKworI2RlZmluZQlERV9TT1VSQ0UJCQkweDAwMDAwMAorI2RlZmluZQlERV9TT1VSQ0VfV1JBUAkJCTMxIDogMzEKKyNkZWZpbmUJREVfU09VUkNFX1dSQVBfRElTQUJMRQkJMAorI2RlZmluZQlERV9TT1VSQ0VfV1JBUF9FTkFCTEUJCTEKKyNkZWZpbmUJREVfU09VUkNFX1hfSzEJCQkyOSA6IDE2CisjZGVmaW5lCURFX1NPVVJDRV9ZX0syCQkJMTUgOiAwCisKKyNkZWZpbmUJREVfREVTVElOQVRJT04JCQkweDAwMDAwNAorI2RlZmluZQlERV9ERVNUSU5BVElPTl9XUkFQCQkzMSA6IDMxCisjZGVmaW5lCURFX0RFU1RJTkFUSU9OX1dSQVBfRElTQUJMRQkwCisjZGVmaW5lCURFX0RFU1RJTkFUSU9OX1dSQVBfRU5BQkxFCTEKKyNkZWZpbmUJREVfREVTVElOQVRJT05fWAkJMjggOiAxNgorI2RlZmluZQlERV9ERVNUSU5BVElPTl9ZCQkxNSA6IDAKKworI2RlZmluZQlERV9ESU1FTlNJT04JCQkweDAwMDAwOAorI2RlZmluZQlERV9ESU1FTlNJT05fWAkJCTI4IDogMTYKKyNkZWZpbmUJREVfRElNRU5TSU9OX1lfRVQJCTE1IDogMAorCisjZGVmaW5lCURFX0NPTlRST0wJCQkweDAwMDAwQworI2RlZmluZQlERV9DT05UUk9MX1NUQVRVUwkJMzEgOiAzMQorI2RlZmluZQlERV9DT05UUk9MX1NUQVRVU19TVE9QCQkwCisjZGVmaW5lCURFX0NPTlRST0xfU1RBVFVTX1NUQVJUCQkxCisjZGVmaW5lCURFX0NPTlRST0xfUEFUVEVSTgkJMzAgOiAzMAorI2RlZmluZQlERV9DT05UUk9MX1BBVFRFUk5fTU9OTwkJMAorI2RlZmluZQlERV9DT05UUk9MX1BBVFRFUk5fQ09MT1IJMQorI2RlZmluZQlERV9DT05UUk9MX1VQREFURV9ERVNUSU5BVElPTl9YCQkyOSA6IDI5CisjZGVmaW5lCURFX0NPTlRST0xfVVBEQVRFX0RFU1RJTkFUSU9OX1hfRElTQUJMRQkwCisjZGVmaW5lCURFX0NPTlRST0xfVVBEQVRFX0RFU1RJTkFUSU9OX1hfRU5BQkxFCTEKKyNkZWZpbmUJREVfQ09OVFJPTF9RVUlDS19TVEFSVAkJCTI4IDogMjgKKyNkZWZpbmUJREVfQ09OVFJPTF9RVUlDS19TVEFSVF9ESVNBQkxFCQkwCisjZGVmaW5lCURFX0NPTlRST0xfUVVJQ0tfU1RBUlRfRU5BQkxFCQkxCisjZGVmaW5lCURFX0NPTlRST0xfRElSRUNUSU9OCQkJMjcgOiAyNworI2RlZmluZQlERV9DT05UUk9MX0RJUkVDVElPTl9MRUZUX1RPX1JJR0hUCTAKKyNkZWZpbmUJREVfQ09OVFJPTF9ESVJFQ1RJT05fUklHSFRfVE9fTEVGVAkxCisjZGVmaW5lCURFX0NPTlRST0xfTUFKT1IJCQkyNiA6IDI2CisjZGVmaW5lCURFX0NPTlRST0xfTUFKT1JfWAkJCTAKKyNkZWZpbmUJREVfQ09OVFJPTF9NQUpPUl9ZCQkJMQorI2RlZmluZQlERV9DT05UUk9MX1NURVBfWAkJCTI1IDogMjUKKyNkZWZpbmUJREVfQ09OVFJPTF9TVEVQX1hfUE9TSVRJVkUJCTEKKyNkZWZpbmUJREVfQ09OVFJPTF9TVEVQX1hfTkVHQVRJVkUJCTAKKyNkZWZpbmUJREVfQ09OVFJPTF9TVEVQX1kJCQkyNCA6IDI0CisjZGVmaW5lCURFX0NPTlRST0xfU1RFUF9ZX1BPU0lUSVZFCQkxCisjZGVmaW5lCURFX0NPTlRST0xfU1RFUF9ZX05FR0FUSVZFCQkwCisjZGVmaW5lCURFX0NPTlRST0xfU1RSRVRDSAkJCTIzIDogMjMKKyNkZWZpbmUJREVfQ09OVFJPTF9TVFJFVENIX0RJU0FCTEUJCTAKKyNkZWZpbmUJREVfQ09OVFJPTF9TVFJFVENIX0VOQUJMRQkJMQorI2RlZmluZQlERV9DT05UUk9MX0hPU1QJCQkJMjIgOiAyMgorI2RlZmluZQlERV9DT05UUk9MX0hPU1RfQ09MT1IJCQkwCisjZGVmaW5lCURFX0NPTlRST0xfSE9TVF9NT05PCQkJMQorI2RlZmluZQlERV9DT05UUk9MX0xBU1RfUElYRUwJCQkyMSA6IDIxCisjZGVmaW5lCURFX0NPTlRST0xfTEFTVF9QSVhFTF9PRkYJCTAKKyNkZWZpbmUJREVfQ09OVFJPTF9MQVNUX1BJWEVMX09OCQkxCisjZGVmaW5lCURFX0NPTlRST0xfQ09NTUFORAkJCTIwIDogMTYKKyNkZWZpbmUJREVfQ09OVFJPTF9DT01NQU5EX0JJVEJMVAkJMAorI2RlZmluZQlERV9DT05UUk9MX0NPTU1BTkRfUkVDVEFOR0xFX0ZJTEwJMQorI2RlZmluZQlERV9DT05UUk9MX0NPTU1BTkRfREVfVElMRQkJMgorI2RlZmluZQlERV9DT05UUk9MX0NPTU1BTkRfVFJBUEVaT0lEX0ZJTEwJMworI2RlZmluZQlERV9DT05UUk9MX0NPTU1BTkRfQUxQSEFfQkxFTkQJCTQKKyNkZWZpbmUJREVfQ09OVFJPTF9DT01NQU5EX1JMRV9TVFJJUAkJNQorI2RlZmluZQlERV9DT05UUk9MX0NPTU1BTkRfU0hPUlRfU1RST0tFCQk2CisjZGVmaW5lCURFX0NPTlRST0xfQ09NTUFORF9MSU5FX0RSQVcJCTcKKyNkZWZpbmUJREVfQ09OVFJPTF9DT01NQU5EX0hPU1RfV1JJVEUJCTgKKyNkZWZpbmUJREVfQ09OVFJPTF9DT01NQU5EX0hPU1RfUkVBRAkJOQorI2RlZmluZQlERV9DT05UUk9MX0NPTU1BTkRfSE9TVF9XUklURV9CT1RUT01fVVAJMTAKKyNkZWZpbmUJREVfQ09OVFJPTF9DT01NQU5EX1JPVEFURQkJMTEKKyNkZWZpbmUJREVfQ09OVFJPTF9DT01NQU5EX0ZPTlQJCQkxMgorI2RlZmluZQlERV9DT05UUk9MX0NPTU1BTkRfVEVYVFVSRV9MT0FECQkxNQorI2RlZmluZQlERV9DT05UUk9MX1JPUF9TRUxFQ1QJCQkxNSA6IDE1CisjZGVmaW5lCURFX0NPTlRST0xfUk9QX1NFTEVDVF9ST1AzCQkwCisjZGVmaW5lCURFX0NPTlRST0xfUk9QX1NFTEVDVF9ST1AyCQkxCisjZGVmaW5lCURFX0NPTlRST0xfUk9QMl9TT1VSQ0UJCQkxNCA6IDE0CisjZGVmaW5lCURFX0NPTlRST0xfUk9QMl9TT1VSQ0VfQklUTUFQCQkwCisjZGVmaW5lCURFX0NPTlRST0xfUk9QMl9TT1VSQ0VfUEFUVEVSTgkJMQorI2RlZmluZQlERV9DT05UUk9MX01PTk9fREFUQQkJCTEzIDogMTIKKyNkZWZpbmUJREVfQ09OVFJPTF9NT05PX0RBVEFfTk9UX1BBQ0tFRAkJMAorI2RlZmluZQlERV9DT05UUk9MX01PTk9fREFUQV84X1BBQ0tFRAkJMQorI2RlZmluZQlERV9DT05UUk9MX01PTk9fREFUQV8xNl9QQUNLRUQJCTIKKyNkZWZpbmUJREVfQ09OVFJPTF9NT05PX0RBVEFfMzJfUEFDS0VECQkzCisjZGVmaW5lCURFX0NPTlRST0xfUkVQRUFUX1JPVEFURQkJMTEgOiAxMQorI2RlZmluZQlERV9DT05UUk9MX1JFUEVBVF9ST1RBVEVfRElTQUJMRQkwCisjZGVmaW5lCURFX0NPTlRST0xfUkVQRUFUX1JPVEFURV9FTkFCTEUJCTEKKyNkZWZpbmUJREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfTUFUQ0gJCTEwIDogMTAKKyNkZWZpbmUJREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfTUFUQ0hfT1BBUVVFCQkwCisjZGVmaW5lCURFX0NPTlRST0xfVFJBTlNQQVJFTkNZX01BVENIX1RSQU5TUEFSRU5UCTEKKyNkZWZpbmUJREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfU0VMRUNUCQkJOSA6IDkKKyNkZWZpbmUJREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfU0VMRUNUX1NPVVJDRQkJMAorI2RlZmluZQlERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9TRUxFQ1RfREVTVElOQVRJT04JMQorI2RlZmluZQlERV9DT05UUk9MX1RSQU5TUEFSRU5DWQkJCQk4IDogOAorI2RlZmluZQlERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9ESVNBQkxFCQkJMAorI2RlZmluZQlERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9FTkFCTEUJCQkxCisjZGVmaW5lCURFX0NPTlRST0xfUk9QCQkJCQk3IDogMAorCisvKiBQc2V1ZG8gZmllbGRzLiAqLworCisjZGVmaW5lCURFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUgkJCTI3IDogMjQKKyNkZWZpbmUJREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzIyNQkJCTAKKyNkZWZpbmUJREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzEzNQkJCTEKKyNkZWZpbmUJREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzMxNQkJCTIKKyNkZWZpbmUJREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzQ1CQkJMworI2RlZmluZQlERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfMjcwCQkJNAorI2RlZmluZQlERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfOTAJCQk1CisjZGVmaW5lCURFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8xODAJCQk4CisjZGVmaW5lCURFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8wCQkJMTAKKyNkZWZpbmUJREVfQ09OVFJPTF9ST1RBVElPTgkJCQkyNSA6IDI0CisjZGVmaW5lCURFX0NPTlRST0xfUk9UQVRJT05fMAkJCQkwCisjZGVmaW5lCURFX0NPTlRST0xfUk9UQVRJT05fMjcwCQkJCTEKKyNkZWZpbmUJREVfQ09OVFJPTF9ST1RBVElPTl85MAkJCQkyCisjZGVmaW5lCURFX0NPTlRST0xfUk9UQVRJT05fMTgwCQkJCTMKKworI2RlZmluZQlERV9QSVRDSAkJCQkJMHgwMDAwMTAKKyNkZWZpbmUJREVfUElUQ0hfREVTVElOQVRJT04JCQkJMjggOiAxNgorI2RlZmluZQlERV9QSVRDSF9TT1VSQ0UJCQkJCTEyIDogMAorCisjZGVmaW5lCURFX0ZPUkVHUk9VTkQJCQkJCTB4MDAwMDE0CisjZGVmaW5lCURFX0ZPUkVHUk9VTkRfQ09MT1IJCQkJMzEgOiAwCisKKyNkZWZpbmUJREVfQkFDS0dST1VORAkJCQkJMHgwMDAwMTgKKyNkZWZpbmUJREVfQkFDS0dST1VORF9DT0xPUgkJCQkzMSA6IDAKKworI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVAkJCQkweDAwMDAxQworI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1hZCQkJMzAgOiAzMAorI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1hZX05PUk1BTAkJMAorI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1hZX09WRVJXUklURQkJMQorI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1kJCQkyOSA6IDI3CisjZGVmaW5lCURFX1NUUkVUQ0hfRk9STUFUX1BBVFRFUk5fWAkJCTI1IDogMjMKKyNkZWZpbmUJREVfU1RSRVRDSF9GT1JNQVRfUElYRUxfRk9STUFUCQkJMjEgOiAyMAorI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVF9QSVhFTF9GT1JNQVRfOAkJMAorI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVF9QSVhFTF9GT1JNQVRfMTYJCTEKKyNkZWZpbmUJREVfU1RSRVRDSF9GT1JNQVRfUElYRUxfRk9STUFUXzI0CQkzCisjZGVmaW5lCURFX1NUUkVUQ0hfRk9STUFUX1BJWEVMX0ZPUk1BVF8zMgkJMgorI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVF9BRERSRVNTSU5HCQkJMTkgOiAxNgorI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVF9BRERSRVNTSU5HX1hZCQkJMAorI2RlZmluZQlERV9TVFJFVENIX0ZPUk1BVF9BRERSRVNTSU5HX0xJTkVBUgkJMTUKKyNkZWZpbmUJREVfU1RSRVRDSF9GT1JNQVRfU09VUkNFX0hFSUdIVAkJCTExIDogMAorCisjZGVmaW5lCURFX0NPTE9SX0NPTVBBUkUJCQkJMHgwMDAwMjAKKyNkZWZpbmUJREVfQ09MT1JfQ09NUEFSRV9DT0xPUgkJCQkyMyA6IDAKKworI2RlZmluZQlERV9DT0xPUl9DT01QQVJFX01BU0sJCQkJMHgwMDAwMjQKKyNkZWZpbmUJREVfQ09MT1JfQ09NUEFSRV9NQVNLX01BU0tTCQkJMjMgOiAwCisKKyNkZWZpbmUJREVfTUFTS1MJCQkJCTB4MDAwMDI4CisjZGVmaW5lCURFX01BU0tTX0JZVEVfTUFTSwkJCQkzMSA6IDE2CisjZGVmaW5lCURFX01BU0tTX0JJVF9NQVNLCQkJCTE1IDogMAorCisjZGVmaW5lCURFX0NMSVBfVEwJCQkJCTB4MDAwMDJDCisjZGVmaW5lCURFX0NMSVBfVExfVE9QCQkJCQkzMSA6IDE2CisjZGVmaW5lCURFX0NMSVBfVExfU1RBVFVTCQkJCTEzIDogMTMKKyNkZWZpbmUJREVfQ0xJUF9UTF9TVEFUVVNfRElTQUJMRQkJCTAKKyNkZWZpbmUJREVfQ0xJUF9UTF9TVEFUVVNfRU5BQkxFCQkJMQorI2RlZmluZQlERV9DTElQX1RMX0lOSElCSVQJCQkJMTIgOiAxMgorI2RlZmluZQlERV9DTElQX1RMX0lOSElCSVRfT1VUU0lERQkJCTAKKyNkZWZpbmUJREVfQ0xJUF9UTF9JTkhJQklUX0lOU0lERQkJCTEKKyNkZWZpbmUJREVfQ0xJUF9UTF9MRUZUCQkJCQkxMSA6IDAKKworI2RlZmluZQlERV9DTElQX0JSCQkJCQkweDAwMDAzMAorI2RlZmluZQlERV9DTElQX0JSX0JPVFRPTQkJCQkzMSA6IDE2CisjZGVmaW5lCURFX0NMSVBfQlJfUklHSFQJCQkJMTIgOiAwCisKKyNkZWZpbmUJREVfTU9OT19QQVRURVJOX0xPVwkJCQkweDAwMDAzNAorI2RlZmluZQlERV9NT05PX1BBVFRFUk5fTE9XX1BBVFRFUk4JCQkzMSA6IDAKKworI2RlZmluZQlERV9NT05PX1BBVFRFUk5fSElHSAkJCQkweDAwMDAzOAorI2RlZmluZQlERV9NT05PX1BBVFRFUk5fSElHSF9QQVRURVJOCQkJMzEgOiAwCisKKyNkZWZpbmUJREVfV0lORE9XX1dJRFRICQkJCQkweDAwMDAzQworI2RlZmluZQlERV9XSU5ET1dfV0lEVEhfREVTVElOQVRJT04JCQkyOCA6IDE2CisjZGVmaW5lCURFX1dJTkRPV19XSURUSF9TT1VSQ0UJCQkJMTIgOiAwCisKKyNkZWZpbmUJREVfV0lORE9XX1NPVVJDRV9CQVNFCQkJCTB4MDAwMDQwCisjZGVmaW5lCURFX1dJTkRPV19TT1VSQ0VfQkFTRV9FWFQJCQkyNyA6IDI3CisjZGVmaW5lCURFX1dJTkRPV19TT1VSQ0VfQkFTRV9FWFRfTE9DQUwJCQkwCisjZGVmaW5lCURFX1dJTkRPV19TT1VSQ0VfQkFTRV9FWFRfRVhURVJOQUwJCTEKKyNkZWZpbmUJREVfV0lORE9XX1NPVVJDRV9CQVNFX0NTCQkJMjYgOiAyNgorI2RlZmluZQlERV9XSU5ET1dfU09VUkNFX0JBU0VfQ1NfMAkJCTAKKyNkZWZpbmUJREVfV0lORE9XX1NPVVJDRV9CQVNFX0NTXzEJCQkxCisjZGVmaW5lCURFX1dJTkRPV19TT1VSQ0VfQkFTRV9BRERSRVNTCQkJMjUgOiAwCisKKyNkZWZpbmUJREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UJCQkweDAwMDA0NAorI2RlZmluZQlERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9FWFQJCQkyNyA6IDI3CisjZGVmaW5lCURFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0VYVF9MT0NBTAkJMAorI2RlZmluZQlERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9FWFRfRVhURVJOQUwJCTEKKyNkZWZpbmUJREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfQ1MJCQkyNiA6IDI2CisjZGVmaW5lCURFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0NTXzAJCQkwCisjZGVmaW5lCURFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0NTXzEJCQkxCisjZGVmaW5lCURFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0FERFJFU1MJCTI1IDogMAorCisjZGVmaW5lCURFX0FMUEhBCQkJCQkweDAwMDA0OAorI2RlZmluZQlERV9BTFBIQV9WQUxVRQkJCQkJNyA6IDAKKworI2RlZmluZQlERV9XUkFQCQkJCQkJMHgwMDAwNEMKKyNkZWZpbmUJREVfV1JBUF9YCQkJCQkzMSA6IDE2CisjZGVmaW5lCURFX1dSQVBfWQkJCQkJMTUgOiAwCisKKyNkZWZpbmUJREVfU1RBVFVTCQkJCQkweDAwMDA1MAorI2RlZmluZQlERV9TVEFUVVNfQ1NDCQkJCQkxIDogMQorI2RlZmluZQlERV9TVEFUVVNfQ1NDX0NMRUFSCQkJCTAKKyNkZWZpbmUJREVfU1RBVFVTX0NTQ19OT1RfQUNUSVZFCQkJMAorI2RlZmluZQlERV9TVEFUVVNfQ1NDX0FDVElWRQkJCQkxCisjZGVmaW5lCURFX1NUQVRVU18yRAkJCQkJMCA6IDAKKyNkZWZpbmUJREVfU1RBVFVTXzJEX0NMRUFSCQkJCTAKKyNkZWZpbmUJREVfU1RBVFVTXzJEX05PVF9BQ1RJVkUJCQkJMAorI2RlZmluZQlERV9TVEFUVVNfMkRfQUNUSVZFCQkJCTEKKworLyogQ29sb3IgU3BhY2UgQ29udmVyc2lvbiByZWdpc3RlcnMuICovCisKKyNkZWZpbmUJQ1NDX1lfU09VUkNFX0JBU0UJCQkJMHgwMDAwQzgKKyNkZWZpbmUJQ1NDX1lfU09VUkNFX0JBU0VfRVhUCQkJCTI3IDogMjcKKyNkZWZpbmUJQ1NDX1lfU09VUkNFX0JBU0VfRVhUX0xPQ0FMCQkJMAorI2RlZmluZQlDU0NfWV9TT1VSQ0VfQkFTRV9FWFRfRVhURVJOQUwJCQkxCisjZGVmaW5lCUNTQ19ZX1NPVVJDRV9CQVNFX0NTCQkJCTI2IDogMjYKKyNkZWZpbmUJQ1NDX1lfU09VUkNFX0JBU0VfQ1NfMAkJCQkwCisjZGVmaW5lCUNTQ19ZX1NPVVJDRV9CQVNFX0NTXzEJCQkJMQorI2RlZmluZQlDU0NfWV9TT1VSQ0VfQkFTRV9BRERSRVNTCQkJMjUgOiAwCisKKyNkZWZpbmUJQ1NDX0NPTlNUQU5UUwkJCQkJMHgwMDAwQ0MKKyNkZWZpbmUJQ1NDX0NPTlNUQU5UU19ZCQkJCQkzMSA6IDI0CisjZGVmaW5lCUNTQ19DT05TVEFOVFNfUgkJCQkJMjMgOiAxNgorI2RlZmluZQlDU0NfQ09OU1RBTlRTX0cJCQkJCTE1IDogOAorI2RlZmluZQlDU0NfQ09OU1RBTlRTX0IJCQkJCTcgOiAwCisKKyNkZWZpbmUJQ1NDX1lfU09VUkNFX1gJCQkJCTB4MDAwMEQwCisjZGVmaW5lCUNTQ19ZX1NPVVJDRV9YX0lOVEVHRVIJCQkJMjYgOiAxNgorI2RlZmluZQlDU0NfWV9TT1VSQ0VfWF9GUkFDVElPTgkJCQkxNSA6IDMKKworI2RlZmluZQlDU0NfWV9TT1VSQ0VfWQkJCQkJMHgwMDAwRDQKKyNkZWZpbmUJQ1NDX1lfU09VUkNFX1lfSU5URUdFUgkJCQkyNyA6IDE2CisjZGVmaW5lCUNTQ19ZX1NPVVJDRV9ZX0ZSQUNUSU9OCQkJCTE1IDogMworCisjZGVmaW5lCUNTQ19VX1NPVVJDRV9CQVNFCQkJCTB4MDAwMEQ4CisjZGVmaW5lCUNTQ19VX1NPVVJDRV9CQVNFX0VYVAkJCQkyNyA6IDI3CisjZGVmaW5lCUNTQ19VX1NPVVJDRV9CQVNFX0VYVF9MT0NBTAkJCTAKKyNkZWZpbmUJQ1NDX1VfU09VUkNFX0JBU0VfRVhUX0VYVEVSTkFMCQkJMQorI2RlZmluZQlDU0NfVV9TT1VSQ0VfQkFTRV9DUwkJCQkyNiA6IDI2CisjZGVmaW5lCUNTQ19VX1NPVVJDRV9CQVNFX0NTXzAJCQkJMAorI2RlZmluZQlDU0NfVV9TT1VSQ0VfQkFTRV9DU18xCQkJCTEKKyNkZWZpbmUJQ1NDX1VfU09VUkNFX0JBU0VfQUREUkVTUwkJCTI1IDogMAorCisjZGVmaW5lCUNTQ19WX1NPVVJDRV9CQVNFCQkJCTB4MDAwMERDCisjZGVmaW5lCUNTQ19WX1NPVVJDRV9CQVNFX0VYVAkJCQkyNyA6IDI3CisjZGVmaW5lCUNTQ19WX1NPVVJDRV9CQVNFX0VYVF9MT0NBTAkJCTAKKyNkZWZpbmUJQ1NDX1ZfU09VUkNFX0JBU0VfRVhUX0VYVEVSTkFMCQkJMQorI2RlZmluZQlDU0NfVl9TT1VSQ0VfQkFTRV9DUwkJCQkyNiA6IDI2CisjZGVmaW5lCUNTQ19WX1NPVVJDRV9CQVNFX0NTXzAJCQkJMAorI2RlZmluZQlDU0NfVl9TT1VSQ0VfQkFTRV9DU18xCQkJCTEKKyNkZWZpbmUJQ1NDX1ZfU09VUkNFX0JBU0VfQUREUkVTUwkJCTI1IDogMAorCisjZGVmaW5lCUNTQ19TT1VSQ0VfRElNRU5TSU9OCQkJCTB4MDAwMEUwCisjZGVmaW5lCUNTQ19TT1VSQ0VfRElNRU5TSU9OX1gJCQkJMzEgOiAxNgorI2RlZmluZQlDU0NfU09VUkNFX0RJTUVOU0lPTl9ZCQkJCTE1IDogMAorCisjZGVmaW5lCUNTQ19TT1VSQ0VfUElUQ0gJCQkJMHgwMDAwRTQKKyNkZWZpbmUJQ1NDX1NPVVJDRV9QSVRDSF9ZCQkJCTMxIDogMTYKKyNkZWZpbmUJQ1NDX1NPVVJDRV9QSVRDSF9VVgkJCQkxNSA6IDAKKworI2RlZmluZQlDU0NfREVTVElOQVRJT04JCQkJCTB4MDAwMEU4CisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9XUkFQCQkJCTMxIDogMzEKKyNkZWZpbmUJQ1NDX0RFU1RJTkFUSU9OX1dSQVBfRElTQUJMRQkJCTAKKyNkZWZpbmUJQ1NDX0RFU1RJTkFUSU9OX1dSQVBfRU5BQkxFCQkJMQorI2RlZmluZQlDU0NfREVTVElOQVRJT05fWAkJCQkyNyA6IDE2CisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9ZCQkJCTExIDogMAorCisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9ESU1FTlNJT04JCQkweDAwMDBFQworI2RlZmluZQlDU0NfREVTVElOQVRJT05fRElNRU5TSU9OX1gJCQkzMSA6IDE2CisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9ESU1FTlNJT05fWQkJCTE1IDogMAorCisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9QSVRDSAkJCQkweDAwMDBGMAorI2RlZmluZQlDU0NfREVTVElOQVRJT05fUElUQ0hfWAkJCQkzMSA6IDE2CisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9QSVRDSF9ZCQkJCTE1IDogMAorCisjZGVmaW5lCUNTQ19TQ0FMRV9GQUNUT1IJCQkJMHgwMDAwRjQKKyNkZWZpbmUJQ1NDX1NDQUxFX0ZBQ1RPUl9IT1JJWk9OVEFMCQkJMzEgOiAxNgorI2RlZmluZQlDU0NfU0NBTEVfRkFDVE9SX1ZFUlRJQ0FMCQkJMTUgOiAwCisKKyNkZWZpbmUJQ1NDX0RFU1RJTkFUSU9OX0JBU0UJCQkJMHgwMDAwRjgKKyNkZWZpbmUJQ1NDX0RFU1RJTkFUSU9OX0JBU0VfRVhUCQkJMjcgOiAyNworI2RlZmluZQlDU0NfREVTVElOQVRJT05fQkFTRV9FWFRfTE9DQUwJCQkwCisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9CQVNFX0VYVF9FWFRFUk5BTAkJMQorI2RlZmluZQlDU0NfREVTVElOQVRJT05fQkFTRV9DUwkJCQkyNiA6IDI2CisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9CQVNFX0NTXzAJCQkwCisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9CQVNFX0NTXzEJCQkxCisjZGVmaW5lCUNTQ19ERVNUSU5BVElPTl9CQVNFX0FERFJFU1MJCQkyNSA6IDAKKworI2RlZmluZQlDU0NfQ09OVFJPTAkJCQkJMHgwMDAwRkMKKyNkZWZpbmUJQ1NDX0NPTlRST0xfU1RBVFVTCQkJCTMxIDogMzEKKyNkZWZpbmUJQ1NDX0NPTlRST0xfU1RBVFVTX1NUT1AJCQkJMAorI2RlZmluZQlDU0NfQ09OVFJPTF9TVEFUVVNfU1RBUlQJCQkxCisjZGVmaW5lCUNTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVQJCQkzMCA6IDI4CisjZGVmaW5lCUNTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVRfWVVWNDIyCQkwCisjZGVmaW5lCUNTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVRfWVVWNDIwSQkJMQorI2RlZmluZQlDU0NfQ09OVFJPTF9TT1VSQ0VfRk9STUFUX1lVVjQyMAkJMgorI2RlZmluZQlDU0NfQ09OVFJPTF9TT1VSQ0VfRk9STUFUX1lWVTkJCQkzCisjZGVmaW5lCUNTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVRfSVlVMQkJCTQKKyNkZWZpbmUJQ1NDX0NPTlRST0xfU09VUkNFX0ZPUk1BVF9JWVUyCQkJNQorI2RlZmluZQlDU0NfQ09OVFJPTF9TT1VSQ0VfRk9STUFUX1JHQjU2NQkJNgorI2RlZmluZQlDU0NfQ09OVFJPTF9TT1VSQ0VfRk9STUFUX1JHQjg4ODgJCTcKKyNkZWZpbmUJQ1NDX0NPTlRST0xfREVTVElOQVRJT05fRk9STUFUCQkJMjcgOiAyNgorI2RlZmluZQlDU0NfQ09OVFJPTF9ERVNUSU5BVElPTl9GT1JNQVRfUkdCNTY1CQkwCisjZGVmaW5lCUNTQ19DT05UUk9MX0RFU1RJTkFUSU9OX0ZPUk1BVF9SR0I4ODg4CQkxCisjZGVmaW5lCUNTQ19DT05UUk9MX0hPUklaT05UQUxfRklMVEVSCQkJMjUgOiAyNQorI2RlZmluZQlDU0NfQ09OVFJPTF9IT1JJWk9OVEFMX0ZJTFRFUl9ESVNBQkxFCQkwCisjZGVmaW5lCUNTQ19DT05UUk9MX0hPUklaT05UQUxfRklMVEVSX0VOQUJMRQkJMQorI2RlZmluZQlDU0NfQ09OVFJPTF9WRVJUSUNBTF9GSUxURVIJCQkyNCA6IDI0CisjZGVmaW5lCUNTQ19DT05UUk9MX1ZFUlRJQ0FMX0ZJTFRFUl9ESVNBQkxFCQkwCisjZGVmaW5lCUNTQ19DT05UUk9MX1ZFUlRJQ0FMX0ZJTFRFUl9FTkFCTEUJCTEKKyNkZWZpbmUJQ1NDX0NPTlRST0xfQllURV9PUkRFUgkJCQkyMyA6IDIzCisjZGVmaW5lCUNTQ19DT05UUk9MX0JZVEVfT1JERVJfWVVZVgkJCTAKKyNkZWZpbmUJQ1NDX0NPTlRST0xfQllURV9PUkRFUl9VWVZZCQkJMQorCisjZGVmaW5lCURFX0RBVEFfUE9SVF81MDEJCQkJMHgxMTAwMDAKKyNkZWZpbmUJREVfREFUQV9QT1JUXzcxMgkJCQkweDQwMDAwMAorI2RlZmluZQlERV9EQVRBX1BPUlRfNzIyCQkJCTB4NjAwMAorCisvKiBwb2ludCB0byB2aXJ0dWFsIE1lbW9yeSBNYXAgSU8gc3RhcnRpbmcgYWRkcmVzcyAqLworZXh0ZXJuIGNoYXIgKnNtdGNfUmVnQmFzZUFkZHJlc3M7CisvKiBwb2ludCB0byB2aXJ0dWFsIHZpZGVvIG1lbW9yeSBzdGFydGluZyBhZGRyZXNzICovCitleHRlcm4gY2hhciAqc210Y19WUkFNQmFzZUFkZHJlc3M7CitleHRlcm4gdW5zaWduZWQgY2hhciBzbXRjX2RlX2J1c3k7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1lbVJlYWQzMih1bnNpZ25lZCBsb25nIG5PZmZzZXQpOworZXh0ZXJuIHZvaWQgbWVtV3JpdGUzMih1bnNpZ25lZCBsb25nIG5PZmZzZXQsIHVuc2lnbmVkIGxvbmcgbkRhdGEpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgU01UQ19yZWFkMkRyZWcodW5zaWduZWQgbG9uZyBuT2Zmc2V0KTsKKworLyogMkQgZnVuY3Rpb25zICovCitleHRlcm4gdm9pZCBkZUluaXQodW5zaWduZWQgaW50IG5Nb2RlV2lkdGgsIHVuc2lnbmVkIGludCBuTW9kZUhlaWdodCwKKwkJICAgdW5zaWduZWQgaW50IGJwcCk7CisKK2V4dGVybiB2b2lkIGRlV2FpdEZvck5vdEJ1c3kodm9pZCk7CisKK2V4dGVybiB2b2lkIGRlVmVydGljYWxMaW5lKHVuc2lnbmVkIGxvbmcgZHN0X2Jhc2UsCisJdW5zaWduZWQgbG9uZyBkc3RfcGl0Y2gsCisJdW5zaWduZWQgbG9uZyBuWCwKKwl1bnNpZ25lZCBsb25nIG5ZLAorCXVuc2lnbmVkIGxvbmcgZHN0X2hlaWdodCwKKwl1bnNpZ25lZCBsb25nIG5Db2xvcik7CisKK2V4dGVybiB2b2lkIGRlSG9yaXpvbnRhbExpbmUodW5zaWduZWQgbG9uZyBkc3RfYmFzZSwKKwl1bnNpZ25lZCBsb25nIGRzdF9waXRjaCwKKwl1bnNpZ25lZCBsb25nIG5YLAorCXVuc2lnbmVkIGxvbmcgblksCisJdW5zaWduZWQgbG9uZyBkc3Rfd2lkdGgsCisJdW5zaWduZWQgbG9uZyBuQ29sb3IpOworCitleHRlcm4gdm9pZCBkZUxpbmUodW5zaWduZWQgbG9uZyBkc3RfYmFzZSwKKwl1bnNpZ25lZCBsb25nIGRzdF9waXRjaCwKKwl1bnNpZ25lZCBsb25nIG5YMSwKKwl1bnNpZ25lZCBsb25nIG5ZMSwKKwl1bnNpZ25lZCBsb25nIG5YMiwKKwl1bnNpZ25lZCBsb25nIG5ZMiwKKwl1bnNpZ25lZCBsb25nIG5Db2xvcik7CisKK2V4dGVybiB2b2lkIGRlRmlsbFJlY3QodW5zaWduZWQgbG9uZyBkc3RfYmFzZSwKKwl1bnNpZ25lZCBsb25nIGRzdF9waXRjaCwKKwl1bnNpZ25lZCBsb25nIGRzdF9YLAorCXVuc2lnbmVkIGxvbmcgZHN0X1ksCisJdW5zaWduZWQgbG9uZyBkc3Rfd2lkdGgsCisJdW5zaWduZWQgbG9uZyBkc3RfaGVpZ2h0LAorCXVuc2lnbmVkIGxvbmcgbkNvbG9yKTsKKworZXh0ZXJuIHZvaWQgZGVSb3RhdGVQYXR0ZXJuKHVuc2lnbmVkIGNoYXIgKnBhdHRlcm5fZHN0YWRkciwKKwl1bnNpZ25lZCBsb25nIHBhdHRlcm5fc3JjX2FkZHIsCisJdW5zaWduZWQgbG9uZyBwYXR0ZXJuX0JQUCwKKwl1bnNpZ25lZCBsb25nIHBhdHRlcm5fc3RyaWRlLAorCWludAlwYXR0ZXJuWCwKKwlpbnQJcGF0dGVyblkpOworCitleHRlcm4gdm9pZCBkZUNvcHkodW5zaWduZWQgbG9uZyBkc3RfYmFzZSwKKwl1bnNpZ25lZCBsb25nIGRzdF9waXRjaCwKKwl1bnNpZ25lZCBsb25nIGRzdF9CUFAsCisJdW5zaWduZWQgbG9uZyBkc3RfWCwKKwl1bnNpZ25lZCBsb25nIGRzdF9ZLAorCXVuc2lnbmVkIGxvbmcgZHN0X3dpZHRoLAorCXVuc2lnbmVkIGxvbmcgZHN0X2hlaWdodCwKKwl1bnNpZ25lZCBsb25nIHNyY19iYXNlLAorCXVuc2lnbmVkIGxvbmcgc3JjX3BpdGNoLAorCXVuc2lnbmVkIGxvbmcgc3JjX1gsCisJdW5zaWduZWQgbG9uZyBzcmNfWSwKKwlwVHJhbnNwYXJlbnQJcFRyYW5zcCwKKwl1bnNpZ25lZCBjaGFyIG5ST1AyKTsKKworLyoKKyAqIFN5c3RlbSBtZW1vcnkgdG8gVmlkZW8gbWVtb3J5IG1vbm9jaHJvbWUgZXhwYW5zaW9uLgorICoKKyAqIFNvdXJjZSBpcyBtb25vY2hyb21lIGltYWdlIGluIHN5c3RlbSBtZW1vcnkuICBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgdGhlCisgKiBtb25vY2hyb21lIGRhdGEgdG8gY29sb3IgaW1hZ2UgaW4gdmlkZW8gbWVtb3J5LgorICoKKyAqIEBwU3JjYnVmOiBwb2ludGVyIHRvIHN0YXJ0IG9mIHNvdXJjZSBidWZmZXIgaW4gc3lzdGVtIG1lbW9yeQorICogQHNyY0RlbHRhOiBQaXRjaCB2YWx1ZSAoaW4gYnl0ZXMpIG9mIHRoZSBzb3VyY2UgYnVmZmVyLCAraXZlIG1lYW5zIHRvcAorICogCQlkb3duIGFuZCAtaXZlIG1lYW4gYnV0dG9uIHVwCisgKiBAc3RhcnRCaXQ6IE1vbm8gZGF0YSBjYW4gc3RhcnQgYXQgYW55IGJpdCBpbiBhIGJ5dGUsIHRoaXMgdmFsdWUgc2hvdWxkCisgKiAJCWJlIDAgdG8gNworICogQGRCYXNlOiBBZGRyZXNzIG9mIGRlc3RpbmF0aW9uIDogIG9mZnNldCBpbiBmcmFtZSBidWZmZXIKKyAqIEBkUGl0Y2g6IFBpdGNoIHZhbHVlIG9mIGRlc3RpbmF0aW9uIHN1cmZhY2UgaW4gQllURQorICogQGJwcDogQ29sb3IgZGVwdGggb2YgZGVzdGluYXRpb24gc3VyZmFjZQorICogQGR4LCBkeTogU3RhcnRpbmcgY29vcmRpbmF0ZSBvZiBkZXN0aW5hdGlvbiBzdXJmYWNlCisgKiBAd2lkdGgsIGhlaWdodDogd2lkdGggYW5kIGhlaWdodCBvZiByZWN0YW5nZSBpbiBwaXhlbCB2YWx1ZQorICogQGZDb2xvcixiQ29sb3I6IEZvcmVncm91bmQsIEJhY2tncm91bmQgY29sb3IgKGNvcnJlc3BvbmRpbmcgdG8gYSAxLCAwIGluCisgKiAJdGhlIG1vbm9jaHJvbWUgZGF0YSkKKyAqIEByb3AyOiBST1AgdmFsdWUKKyAqLworCitleHRlcm4gbG9uZyBkZVN5c3RlbU1lbTJWaWRlb01lbU1vbm9CbHQoCisJY29uc3QgY2hhciAqcFNyY2J1ZiwKKwlsb25nIHNyY0RlbHRhLAorCXVuc2lnbmVkIGxvbmcgc3RhcnRCaXQsCisJdW5zaWduZWQgbG9uZyBkQmFzZSwKKwl1bnNpZ25lZCBsb25nIGRQaXRjaCwKKwl1bnNpZ25lZCBsb25nIGJwcCwKKwl1bnNpZ25lZCBsb25nIGR4LCB1bnNpZ25lZCBsb25nIGR5LAorCXVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LAorCXVuc2lnbmVkIGxvbmcgZkNvbG9yLAorCXVuc2lnbmVkIGxvbmcgYkNvbG9yLAorCXVuc2lnbmVkIGxvbmcgcm9wMik7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRlR2V0VHJhbnNwYXJlbmN5KHZvaWQpOworZXh0ZXJuIHZvaWQgZGVTZXRQaXhlbEZvcm1hdCh1bnNpZ25lZCBsb25nIGJwcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZGJjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9zbXRjZmIuYwpAQCAtMCwwICsxLDEyNTMgQEAKKy8qCisgKiBTaWxpY29uIE1vdGlvbiBTTTdYWCBmcmFtZSBidWZmZXIgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbGljb24gTW90aW9uIFRlY2hub2xvZ3kgQ29ycC4KKyAqIEF1dGhvcnM6IEdlIFdhbmcsIGdld2FuZ0BzaWxpY29ubW90aW9uLmNvbQorICogCSAgICBCb3lvZCBib3lvZC55YW5nQHNpbGljb25tb3Rpb24uY29tLmNuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IExlbW90ZSwgSW5jLgorICogQXV0aG9yOiBXdSBaaGFuZ2ppbiwgd3V6akBsZW1vdGUuY29tCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICogVmVyc2lvbiAwLjEwLjI2MTkyLjIxLjAxCisgKiAJLSBBZGQgUG93ZXJQQy9CaWcgZW5kaWFuIHN1cHBvcnQKKyAqIAktIEFkZCAyRCBzdXBwb3J0IGZvciBMeW54CisgKiAJLSBWZXJpZmllZCBvbjIuNi4xOS4yICBCb3lvZC55YW5nIDxib3lvZC55YW5nQHNpbGljb25tb3Rpb24uY29tLmNuPgorICoKKyAqIFZlcnNpb24gMC4wOS4yNjIxLjAwLjAxCisgKiAJLSBPbmx5IHN1cHBvcnQgTGludXggS2VybmVsJ3MgdmVyc2lvbiAyLjYuMjEuCisgKglCb3lvZC55YW5nICA8Ym95b2QueWFuZ0BzaWxpY29ubW90aW9uLmNvbS5jbj4KKyAqCisgKiBWZXJzaW9uIDAuMDkKKyAqIAktIE9ubHkgc3VwcG9ydCBMaW51eCBLZXJuZWwncyB2ZXJzaW9uIDIuNi4xMi4KKyAqIAlCb3lvZC55YW5nIDxib3lvZC55YW5nQHNpbGljb25tb3Rpb24uY29tLmNuPgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworI2RlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgorCisjaWZkZWYgQ09ORklHX1BNCisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNlbmRpZgorCitzdHJ1Y3Qgc2NyZWVuX2luZm8gc210Y19zY3JlZW5faW5mbzsKKworI2luY2x1ZGUgInNtdGNmYi5oIgorI2luY2x1ZGUgInNtdGMyZC5oIgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgc21kYmcoZm9ybWF0LCBhcmcuLi4pCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIHNtZGJnKGZvcm1hdCwgYXJnLi4uKQorI2VuZGlmCisKKy8qCisqIFByaXZhdGUgc3RydWN0dXJlCisqLworc3RydWN0IHNtdGNmYl9pbmZvIHsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgaXMgYSBwb2ludGVyIHRvIGJlIHBhc3NlZCBpbnRvIHRoZQorCSAqIGZ1bmN0aW9ucyBiZWxvdy4gIFRoZSBtb2R1bGVzIG91dHNpZGUgdGhlIG1haW4KKwkgKiB2b3lhZ2VyLmMgZHJpdmVyIGhhdmUgbm8ga25vd2xlZGdlIGFzIHRvIHdoYXQKKwkgKiBpcyB3aXRoaW4gdGhpcyBzdHJ1Y3R1cmUuCisJICovCisJc3RydWN0IGZiX2luZm8gZmI7CisJc3RydWN0IGRpc3BsYXlfc3dpdGNoICpkaXNwc3c7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzaWduZWQgaW50IGN1cnJjb247CisKKwlzdHJ1Y3QgeworCQl1OCByZWQsIGdyZWVuLCBibHVlOworCX0gcGFsZXR0ZVtOUl9SR0JdOworCisJdV9pbnQgcGFsZXR0ZV9zaXplOworfTsKKworc3RydWN0IHBhcl9pbmZvIHsKKwkvKgorCSAqIEhhcmR3YXJlCisJICovCisJdTE2IGNoaXBJRDsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKm1fcE1NSU87CisJY2hhciBfX2lvbWVtICptX3BMRkI7CisJY2hhciAqbV9wRFBSOworCWNoYXIgKm1fcFZQUjsKKwljaGFyICptX3BDUFI7CisKKwl1X2ludCB3aWR0aDsKKwl1X2ludCBoZWlnaHQ7CisJdV9pbnQgaHo7CisJdV9sb25nIEJhc2VBZGRyZXNzSW5WUkFNOworCXU4IGNoaXBSZXZJRDsKK307CisKK3N0cnVjdCB2ZXNhX21vZGVfdGFibGUJeworCWNoYXIgbW9kZV9pbmRleFs2XTsKKwl1MTYgbGZiX3dpZHRoOworCXUxNiBsZmJfaGVpZ2h0OworCXUxNiBsZmJfZGVwdGg7Cit9OworCitzdGF0aWMgc3RydWN0IHZlc2FfbW9kZV90YWJsZSB2ZXNhX21vZGVbXSA9IHsKKwl7IjB4MzAxIiwgNjQwLCAgNDgwLCAgOH0sCisJeyIweDMwMyIsIDgwMCwgIDYwMCwgIDh9LAorCXsiMHgzMDUiLCAxMDI0LCA3NjgsCTh9LAorCXsiMHgzMDciLCAxMjgwLCAxMDI0LCA4fSwKKworCXsiMHgzMTEiLCA2NDAsICA0ODAsICAxNn0sCisJeyIweDMxNCIsIDgwMCwgIDYwMCwgIDE2fSwKKwl7IjB4MzE3IiwgMTAyNCwgNzY4LAkxNn0sCisJeyIweDMxQSIsIDEyODAsIDEwMjQsIDE2fSwKKworCXsiMHgzMTIiLCA2NDAsICA0ODAsICAyNH0sCisJeyIweDMxNSIsIDgwMCwgIDYwMCwgIDI0fSwKKwl7IjB4MzE4IiwgMTAyNCwgNzY4LAkyNH0sCisJeyIweDMxQiIsIDEyODAsIDEwMjQsIDI0fSwKK307CisKK2NoYXIgX19pb21lbSAqc210Y19SZWdCYXNlQWRkcmVzczsJLyogTWVtb3J5IE1hcCBJTyBzdGFydGluZyBhZGRyZXNzICovCitjaGFyIF9faW9tZW0gKnNtdGNfVlJBTUJhc2VBZGRyZXNzOwkvKiB2aWRlbyBtZW1vcnkgc3RhcnRpbmcgYWRkcmVzcyAqLworCitjaGFyICpzbXRjXzJEQmFzZUFkZHJlc3M7CS8qIDJEIGVuZ2luZSBzdGFydGluZyBhZGRyZXNzICovCitjaGFyICpzbXRjXzJEZGF0YXBvcnQ7CQkvKiAyRCBkYXRhIHBvcnQgb2Zmc2V0ICovCitzaG9ydCBzbXRjXzJEYWNjZWxlcmF0aW9uOworCitzdGF0aWMgdTMyIGNvbHJlZ1sxN107CitzdGF0aWMgc3RydWN0IHBhcl9pbmZvIGh3OwkvKiBoYXJkd2FyZSBpbmZvcm1hdGlvbiAqLworCit1MTYgc210Y19DaGlwSURzW10gPSB7CisJMHg3MTAsCisJMHg3MTIsCisJMHg3MjAKK307CisKKyNkZWZpbmUgbnVtU01UQ2NoaXBJRHMgKHNpemVvZihzbXRjX0NoaXBJRHMpIC8gc2l6ZW9mKHUxNikpCisKK3ZvaWQgZGVXYWl0Rm9yTm90QnVzeSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaSA9IDB4MTAwMDAwMDsKKwl3aGlsZSAoaS0tKSB7CisJCWlmICgoc210Y19zZXFyKDB4MTYpICYgMHgxOCkgPT0gMHgxMCkKKwkJCWJyZWFrOworCX0KKwlzbXRjX2RlX2J1c3kgPSAwOworfQorCitzdGF0aWMgdm9pZCBzbTcxMl9zZXRfdGltaW5nKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiLAorCQkJICAgICBzdHJ1Y3QgcGFyX2luZm8gKnBwYXJfaW5mbykKK3sKKwlpbnQgaSA9IDAsIGogPSAwOworCXUzMiBtX25TY3JlZW5TdHJpZGU7CisKKwlzbWRiZygiXG5wcGFyX2luZm8tPndpZHRoID0gJWQgcHBhcl9pbmZvLT5oZWlnaHQgPSAlZCIKKwkJCSJzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9ICVkIHBwYXJfaW5mby0+aHogPSAlZFxuIiwKKwkJCXBwYXJfaW5mby0+d2lkdGgsIHBwYXJfaW5mby0+aGVpZ2h0LAorCQkJc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwsIHBwYXJfaW5mby0+aHopOworCisJZm9yIChqID0gMDsgaiA8IG51bVZHQU1vZGVzOyBqKyspIHsKKwkJaWYgKFZHQU1vZGVbal0ubW1TaXplWCA9PSBwcGFyX2luZm8tPndpZHRoICYmCisJCSAgICBWR0FNb2RlW2pdLm1tU2l6ZVkgPT0gcHBhcl9pbmZvLT5oZWlnaHQgJiYKKwkJICAgIFZHQU1vZGVbal0uYnBwID09IHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsICYmCisJCSAgICBWR0FNb2RlW2pdLmh6ID09IHBwYXJfaW5mby0+aHopIHsKKworCQkJc21kYmcoIlxuVkdBTW9kZVtqXS5tbVNpemVYICA9ICVkIFZHQU1vZGVbal0ubW1TaXplWSA9IgorCQkJCQkiJWQgVkdBTW9kZVtqXS5icHAgPSAlZCIKKwkJCQkJIlZHQU1vZGVbal0uaHo9JWRcbiIsCisJCQkJCVZHQU1vZGVbal0ubW1TaXplWCwgVkdBTW9kZVtqXS5tbVNpemVZLAorCQkJCQlWR0FNb2RlW2pdLmJwcCwgVkdBTW9kZVtqXS5oeik7CisKKwkJCXNtZGJnKCJWR0FNb2RlIGluZGV4PSVkXG4iLCBqKTsKKworCQkJc210Y19tbWlvd2IoMHgwLCAweDNjNik7CisKKwkJCXNtdGNfc2VxdygwLCAweDEpOworCisJCQlzbXRjX21taW93YihWR0FNb2RlW2pdLkluaXRfTUlTQywgMHgzYzIpOworCisJCQkvKiBpbml0IFNFUSByZWdpc3RlciBTUjAwIC0gU1IwNCAqLworCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfU1IwMF9TUjA0OyBpKyspCisJCQkJc210Y19zZXF3KGksIFZHQU1vZGVbal0uSW5pdF9TUjAwX1NSMDRbaV0pOworCisJCQkvKiBpbml0IFNFUSByZWdpc3RlciBTUjEwIC0gU1IyNCAqLworCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfU1IxMF9TUjI0OyBpKyspCisJCQkJc210Y19zZXF3KGkgKyAweDEwLAorCQkJCQkgIFZHQU1vZGVbal0uSW5pdF9TUjEwX1NSMjRbaV0pOworCisJCQkvKiBpbml0IFNFUSByZWdpc3RlciBTUjMwIC0gU1I3NSAqLworCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfU1IzMF9TUjc1OyBpKyspCisJCQkJaWYgKCgoaSArIDB4MzApICE9IDB4NjIpIFwKKwkJCQkJJiYgKChpICsgMHgzMCkgIT0gMHg2YSkgXAorCQkJCQkmJiAoKGkgKyAweDMwKSAhPSAweDZiKSkKKwkJCQkJc210Y19zZXF3KGkgKyAweDMwLAorCQkJCQkJVkdBTW9kZVtqXS5Jbml0X1NSMzBfU1I3NVtpXSk7CisKKwkJCS8qIGluaXQgU0VRIHJlZ2lzdGVyIFNSODAgLSBTUjkzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9TUjgwX1NSOTM7IGkrKykKKwkJCQlzbXRjX3NlcXcoaSArIDB4ODAsCisJCQkJCSAgVkdBTW9kZVtqXS5Jbml0X1NSODBfU1I5M1tpXSk7CisKKwkJCS8qIGluaXQgU0VRIHJlZ2lzdGVyIFNSQTAgLSBTUkFGICovCisJCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9TUkEwX1NSQUY7IGkrKykKKwkJCQlzbXRjX3NlcXcoaSArIDB4YTAsCisJCQkJCSAgVkdBTW9kZVtqXS5Jbml0X1NSQTBfU1JBRltpXSk7CisKKwkJCS8qIGluaXQgR3JhcGhpYyByZWdpc3RlciBHUjAwIC0gR1IwOCAqLworCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfR1IwMF9HUjA4OyBpKyspCisJCQkJc210Y19ncnBodyhpLCBWR0FNb2RlW2pdLkluaXRfR1IwMF9HUjA4W2ldKTsKKworCQkJLyogaW5pdCBBdHRyaWJ1dGUgcmVnaXN0ZXIgQVIwMCAtIEFSMTQgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBTSVpFX0FSMDBfQVIxNDsgaSsrKQorCQkJCXNtdGNfYXR0cncoaSwgVkdBTW9kZVtqXS5Jbml0X0FSMDBfQVIxNFtpXSk7CisKKwkJCS8qIGluaXQgQ1JUQyByZWdpc3RlciBDUjAwIC0gQ1IxOCAqLworCQkJZm9yIChpID0gMDsgaSA8IFNJWkVfQ1IwMF9DUjE4OyBpKyspCisJCQkJc210Y19jcnRjdyhpLCBWR0FNb2RlW2pdLkluaXRfQ1IwMF9DUjE4W2ldKTsKKworCQkJLyogaW5pdCBDUlRDIHJlZ2lzdGVyIENSMzAgLSBDUjREICovCisJCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9DUjMwX0NSNEQ7IGkrKykKKwkJCQlzbXRjX2NydGN3KGkgKyAweDMwLAorCQkJCQkgICBWR0FNb2RlW2pdLkluaXRfQ1IzMF9DUjREW2ldKTsKKworCQkJLyogaW5pdCBDUlRDIHJlZ2lzdGVyIENSOTAgLSBDUkE3ICovCisJCQlmb3IgKGkgPSAwOyBpIDwgU0laRV9DUjkwX0NSQTc7IGkrKykKKwkJCQlzbXRjX2NydGN3KGkgKyAweDkwLAorCQkJCQkgICBWR0FNb2RlW2pdLkluaXRfQ1I5MF9DUkE3W2ldKTsKKwkJfQorCX0KKwlzbXRjX21taW93YigweDY3LCAweDNjMik7CisKKwkvKiBzZXQgVlBSIHJlZ2lzdGVycyAqLworCXdyaXRlbCgweDAsIHBwYXJfaW5mby0+bV9wVlBSICsgMHgwQyk7CisJd3JpdGVsKDB4MCwgcHBhcl9pbmZvLT5tX3BWUFIgKyAweDQwKTsKKworCS8qIHNldCBkYXRhIHdpZHRoICovCisJbV9uU2NyZWVuU3RyaWRlID0KKwkJKHBwYXJfaW5mby0+d2lkdGggKiBzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCkgLyA2NDsKKwlzd2l0Y2ggKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQl3cml0ZWwoMHgwLCBwcGFyX2luZm8tPm1fcFZQUiArIDB4MCk7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXdyaXRlbCgweDAwMDIwMDAwLCBwcGFyX2luZm8tPm1fcFZQUiArIDB4MCk7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXdyaXRlbCgweDAwMDQwMDAwLCBwcGFyX2luZm8tPm1fcFZQUiArIDB4MCk7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXdyaXRlbCgweDAwMDMwMDAwLCBwcGFyX2luZm8tPm1fcFZQUiArIDB4MCk7CisJCWJyZWFrOworCX0KKwl3cml0ZWwoKHUzMikgKCgobV9uU2NyZWVuU3RyaWRlICsgMikgPDwgMTYpIHwgbV9uU2NyZWVuU3RyaWRlKSwKKwkgICAgICAgcHBhcl9pbmZvLT5tX3BWUFIgKyAweDEwKTsKKworfQorCitzdGF0aWMgdm9pZCBzbTcxMl9zZXRwYWxldHRlKGludCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKKwkJCSAgICAgdW5zaWduZWQgYmx1ZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHBhcl9pbmZvICpjdXJfcGFyID0gKHN0cnVjdCBwYXJfaW5mbyAqKWluZm8tPnBhcjsKKworCWlmIChjdXJfcGFyLT5CYXNlQWRkcmVzc0luVlJBTSkKKwkJLyoKKwkJICogc2Vjb25kIGRpc3BsYXkgcGFsZXR0ZSBmb3IgZHVhbCBoZWFkLiBFbmFibGUgQ1JUIFJBTSwgNi1iaXQKKwkJICogUkFNCisJCSAqLworCQlzbXRjX3NlcXcoMHg2NiwgKHNtdGNfc2VxcigweDY2KSAmIDB4QzMpIHwgMHgyMCk7CisJZWxzZQorCQkvKiBwcmltYXJ5IGRpc3BsYXkgcGFsZXR0ZS4gRW5hYmxlIExDRCBSQU0gb25seSwgNi1iaXQgUkFNICovCisJCXNtdGNfc2VxdygweDY2LCAoc210Y19zZXFyKDB4NjYpICYgMHhDMykgfCAweDEwKTsKKwlzbXRjX21taW93YihyZWdubywgZGFjX3JlZyk7CisJc210Y19tbWlvd2IocmVkID4+IDEwLCBkYWNfdmFsKTsKKwlzbXRjX21taW93YihncmVlbiA+PiAxMCwgZGFjX3ZhbCk7CisJc210Y19tbWlvd2IoYmx1ZSA+PiAxMCwgZGFjX3ZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNtdGNfc2V0X3RpbWluZyhzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYiwgc3RydWN0IHBhcl9pbmZvCisJCSpwcGFyX2luZm8pCit7CisJc3dpdGNoIChwcGFyX2luZm8tPmNoaXBJRCkgeworCWNhc2UgMHg3MTA6CisJY2FzZSAweDcxMjoKKwljYXNlIDB4NzIwOgorCQlzbTcxMl9zZXRfdGltaW5nKHNmYiwgcHBhcl9pbmZvKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHNtdGNmYl92YXIgPSB7CisJLnhyZXMgPSAxMDI0LAorCS55cmVzID0gNjAwLAorCS54cmVzX3ZpcnR1YWwgPSAxMDI0LAorCS55cmVzX3ZpcnR1YWwgPSA2MDAsCisJLmJpdHNfcGVyX3BpeGVsID0gMTYsCisJLnJlZCA9IHsxNiwgOCwgMH0sCisJLmdyZWVuID0gezgsIDgsIDB9LAorCS5ibHVlID0gezAsIDgsIDB9LAorCS5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVywKKwkuaGVpZ2h0ID0gLTEsCisJLndpZHRoID0gLTEsCisJLnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gc210Y2ZiX2ZpeCA9IHsKKwkuaWQgPSAic203MTJmYiIsCisJLnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCisJLnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1IsCisJLmxpbmVfbGVuZ3RoID0gODAwICogMywKKwkuYWNjZWwgPSBGQl9BQ0NFTF9TTUlfTFlOWCwKK307CisKKy8qIGNoYW5fdG9fZmllbGQKKyAqCisgKiBjb252ZXJ0IGEgY29sb3VyIHZhbHVlIGludG8gYSBmaWVsZCBwb3NpdGlvbgorICoKKyAqIGZyb20gcHhhZmIuYworICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNoYW5fdG9fZmllbGQodW5zaWduZWQgaW50IGNoYW4sCisJCQkJCSBzdHJ1Y3QgZmJfYml0ZmllbGQgKmJmKQoreworCWNoYW4gJj0gMHhmZmZmOworCWNoYW4gPj49IDE2IC0gYmYtPmxlbmd0aDsKKwlyZXR1cm4gY2hhbiA8PCBiZi0+b2Zmc2V0OworfQorCitzdGF0aWMgaW50IHNtdGNmYl9ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJLyogY2xlYXIgRFBNUyBzZXR0aW5nICovCisJc3dpdGNoIChibGFua19tb2RlKSB7CisJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgorCQkvKiBTY3JlZW4gT246IEhTeW5jOiBPbiwgVlN5bmMgOiBPbiAqLworCQlzbXRjX3NlcXcoMHgwMSwgKHNtdGNfc2VxcigweDAxKSAmICh+MHgyMCkpKTsKKwkJc210Y19zZXF3KDB4NmEsIDB4MTYpOworCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7CisJCXNtdGNfc2VxdygweDIxLCAoc210Y19zZXFyKDB4MjEpICYgMHg3NykpOworCQlzbXRjX3NlcXcoMHgyMiwgKHNtdGNfc2VxcigweDIyKSAmICh+MHgzMCkpKTsKKwkJc210Y19zZXF3KDB4MjMsIChzbXRjX3NlcXIoMHgyMykgJiAofjB4YzApKSk7CisJCXNtdGNfc2VxdygweDI0LCAoc210Y19zZXFyKDB4MjQpIHwgMHgwMSkpOworCQlzbXRjX3NlcXcoMHgzMSwgKHNtdGNfc2VxcigweDMxKSB8IDB4MDMpKTsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19OT1JNQUw6CisJCS8qIFNjcmVlbiBPZmY6IEhTeW5jOiBPbiwgVlN5bmMgOiBPbiAgIFNvZnQgYmxhbmsgKi8KKwkJc210Y19zZXF3KDB4MDEsIChzbXRjX3NlcXIoMHgwMSkgJiAofjB4MjApKSk7CisJCXNtdGNfc2VxdygweDZhLCAweDE2KTsKKwkJc210Y19zZXF3KDB4NmIsIDB4MDIpOworCQlzbXRjX3NlcXcoMHgyMiwgKHNtdGNfc2VxcigweDIyKSAmICh+MHgzMCkpKTsKKwkJc210Y19zZXF3KDB4MjMsIChzbXRjX3NlcXIoMHgyMykgJiAofjB4YzApKSk7CisJCXNtdGNfc2VxdygweDI0LCAoc210Y19zZXFyKDB4MjQpIHwgMHgwMSkpOworCQlzbXRjX3NlcXcoMHgzMSwgKChzbXRjX3NlcXIoMHgzMSkgJiAofjB4MDcpKSB8IDB4MDApKTsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgorCQkvKiBTY3JlZW4gT246IEhTeW5jOiBPbiwgVlN5bmMgOiBPZmYgKi8KKwkJc210Y19zZXF3KDB4MDEsIChzbXRjX3NlcXIoMHgwMSkgfCAweDIwKSk7CisJCXNtdGNfc2VxdygweDIwLCAoc210Y19zZXFyKDB4MjApICYgKH4weEIwKSkpOworCQlzbXRjX3NlcXcoMHg2YSwgMHgwYyk7CisJCXNtdGNfc2VxdygweDZiLCAweDAyKTsKKwkJc210Y19zZXF3KDB4MjEsIChzbXRjX3NlcXIoMHgyMSkgfCAweDg4KSk7CisJCXNtdGNfc2VxdygweDIyLCAoKHNtdGNfc2VxcigweDIyKSAmICh+MHgzMCkpIHwgMHgyMCkpOworCQlzbXRjX3NlcXcoMHgyMywgKChzbXRjX3NlcXIoMHgyMykgJiAofjB4YzApKSB8IDB4MjApKTsKKwkJc210Y19zZXF3KDB4MjQsIChzbXRjX3NlcXIoMHgyNCkgJiAofjB4MDEpKSk7CisJCXNtdGNfc2VxdygweDMxLCAoKHNtdGNfc2VxcigweDMxKSAmICh+MHgwNykpIHwgMHgwMCkpOworCQlzbXRjX3NlcXcoMHgzNCwgKHNtdGNfc2VxcigweDM0KSB8IDB4ODApKTsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgorCQkvKiBTY3JlZW4gT246IEhTeW5jOiBPZmYsIFZTeW5jIDogT24gKi8KKwkJc210Y19zZXF3KDB4MDEsIChzbXRjX3NlcXIoMHgwMSkgfCAweDIwKSk7CisJCXNtdGNfc2VxdygweDIwLCAoc210Y19zZXFyKDB4MjApICYgKH4weEIwKSkpOworCQlzbXRjX3NlcXcoMHg2YSwgMHgwYyk7CisJCXNtdGNfc2VxdygweDZiLCAweDAyKTsKKwkJc210Y19zZXF3KDB4MjEsIChzbXRjX3NlcXIoMHgyMSkgfCAweDg4KSk7CisJCXNtdGNfc2VxdygweDIyLCAoKHNtdGNfc2VxcigweDIyKSAmICh+MHgzMCkpIHwgMHgxMCkpOworCQlzbXRjX3NlcXcoMHgyMywgKChzbXRjX3NlcXIoMHgyMykgJiAofjB4YzApKSB8IDB4RDgpKTsKKwkJc210Y19zZXF3KDB4MjQsIChzbXRjX3NlcXIoMHgyNCkgJiAofjB4MDEpKSk7CisJCXNtdGNfc2VxdygweDMxLCAoKHNtdGNfc2VxcigweDMxKSAmICh+MHgwNykpIHwgMHgwMCkpOworCQlzbXRjX3NlcXcoMHgzNCwgKHNtdGNfc2VxcigweDM0KSB8IDB4ODApKTsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CisJCS8qIFNjcmVlbiBPbjogSFN5bmM6IE9mZiwgVlN5bmMgOiBPZmYgKi8KKwkJc210Y19zZXF3KDB4MDEsIChzbXRjX3NlcXIoMHgwMSkgfCAweDIwKSk7CisJCXNtdGNfc2VxdygweDIwLCAoc210Y19zZXFyKDB4MjApICYgKH4weEIwKSkpOworCQlzbXRjX3NlcXcoMHg2YSwgMHgwYyk7CisJCXNtdGNfc2VxdygweDZiLCAweDAyKTsKKwkJc210Y19zZXF3KDB4MjEsIChzbXRjX3NlcXIoMHgyMSkgfCAweDg4KSk7CisJCXNtdGNfc2VxdygweDIyLCAoKHNtdGNfc2VxcigweDIyKSAmICh+MHgzMCkpIHwgMHgzMCkpOworCQlzbXRjX3NlcXcoMHgyMywgKChzbXRjX3NlcXIoMHgyMykgJiAofjB4YzApKSB8IDB4RDgpKTsKKwkJc210Y19zZXF3KDB4MjQsIChzbXRjX3NlcXIoMHgyNCkgJiAofjB4MDEpKSk7CisJCXNtdGNfc2VxdygweDMxLCAoKHNtdGNfc2VxcigweDMxKSAmICh+MHgwNykpIHwgMHgwMCkpOworCQlzbXRjX3NlcXcoMHgzNCwgKHNtdGNfc2VxcigweDM0KSB8IDB4ODApKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc210Y19zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCisJCQkgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYiA9IChzdHJ1Y3Qgc210Y2ZiX2luZm8gKilpbmZvOworCXUzMiB2YWw7CisKKwlpZiAocmVnbm8gPiAyNTUpCisJCXJldHVybiAxOworCisJc3dpdGNoIChzZmItPmZiLmZpeC52aXN1YWwpIHsKKwljYXNlIEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjoKKwljYXNlIEZCX1ZJU1VBTF9UUlVFQ09MT1I6CisJCS8qCisJCSAqIDE2LzMyIGJpdCB0cnVlLWNvbG91ciwgdXNlIHBzZXVvLXBhbGV0dGUgZm9yIDE2IGJhc2UgY29sb3IKKwkJICovCisJCWlmIChyZWdubyA8IDE2KSB7CisJCQlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMTYpIHsKKwkJCQl1MzIgKnBhbCA9IHNmYi0+ZmIucHNldWRvX3BhbGV0dGU7CisJCQkJdmFsID0gY2hhbl90b19maWVsZChyZWQsICZzZmItPmZiLnZhci5yZWQpOworCQkJCXZhbCB8PSBjaGFuX3RvX2ZpZWxkKGdyZWVuLCBcCisJCQkJCQkmc2ZiLT5mYi52YXIuZ3JlZW4pOworCQkJCXZhbCB8PSBjaGFuX3RvX2ZpZWxkKGJsdWUsICZzZmItPmZiLnZhci5ibHVlKTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCQlwYWxbcmVnbm9dID0KKwkJCQkgICAgKChyZWQgJiAweGY4MDApID4+IDgpIHwKKwkJCQkgICAgKChncmVlbiAmIDB4ZTAwMCkgPj4gMTMpIHwKKwkJCQkgICAgKChncmVlbiAmIDB4MWMwMCkgPDwgMykgfAorCQkJCSAgICAoKGJsdWUgJiAweGY4MDApID4+IDMpOworI2Vsc2UKKwkJCQlwYWxbcmVnbm9dID0gdmFsOworI2VuZGlmCisJCQl9IGVsc2UgeworCQkJCXUzMiAqcGFsID0gc2ZiLT5mYi5wc2V1ZG9fcGFsZXR0ZTsKKwkJCQl2YWwgPSBjaGFuX3RvX2ZpZWxkKHJlZCwgJnNmYi0+ZmIudmFyLnJlZCk7CisJCQkJdmFsIHw9IGNoYW5fdG9fZmllbGQoZ3JlZW4sIFwKKwkJCQkJCSZzZmItPmZiLnZhci5ncmVlbik7CisJCQkJdmFsIHw9IGNoYW5fdG9fZmllbGQoYmx1ZSwgJnNmYi0+ZmIudmFyLmJsdWUpOworI2lmZGVmIF9fQklHX0VORElBTgorCQkJCXZhbCA9CisJCQkJICAgICh2YWwgJiAweGZmMDBmZjAwID4+IDgpIHwKKwkJCQkgICAgKHZhbCAmIDB4MDBmZjAwZmYgPDwgOCk7CisjZW5kaWYKKwkJCQlwYWxbcmVnbm9dID0gdmFsOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBGQl9WSVNVQUxfUFNFVURPQ09MT1I6CisJCS8qIGNvbG9yIGRlcHRoIDggYml0ICovCisJCXNtNzEyX3NldHBhbGV0dGUocmVnbm8sIHJlZCwgZ3JlZW4sIGJsdWUsIGluZm8pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAxOwkvKiB1bmtub3duIHR5cGUgKi8KKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisjaWZkZWYgX19CSUdfRU5ESUFOCitzdGF0aWMgc3NpemVfdCBzbXRjZmJfcmVhZChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdAorCQkJCWNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7CisKKwl1MzIgKmJ1ZmZlciwgKmRzdDsKKwl1MzIgX19pb21lbSAqc3JjOworCWludCBjLCBpLCBjbnQgPSAwLCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKKworCWlmICghaW5mbyB8fCAhaW5mby0+c2NyZWVuX2Jhc2UpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm4gLUVQRVJNOworCisJdG90YWxfc2l6ZSA9IGluZm8tPnNjcmVlbl9zaXplOworCisJaWYgKHRvdGFsX3NpemUgPT0gMCkKKwkJdG90YWxfc2l6ZSA9IGluZm8tPmZpeC5zbWVtX2xlbjsKKworCWlmIChwID49IHRvdGFsX3NpemUpCisJCXJldHVybiAwOworCisJaWYgKGNvdW50ID49IHRvdGFsX3NpemUpCisJCWNvdW50ID0gdG90YWxfc2l6ZTsKKworCWlmIChjb3VudCArIHAgPiB0b3RhbF9zaXplKQorCQljb3VudCA9IHRvdGFsX3NpemUgLSBwOworCisJYnVmZmVyID0ga21hbGxvYygoY291bnQgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogY291bnQsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNyYyA9ICh1MzIgX19pb21lbSAqKSAoaW5mby0+c2NyZWVuX2Jhc2UgKyBwKTsKKworCWlmIChpbmZvLT5mYm9wcy0+ZmJfc3luYykKKwkJaW5mby0+ZmJvcHMtPmZiX3N5bmMoaW5mbyk7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJYyA9IChjb3VudCA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBjb3VudDsKKwkJZHN0ID0gYnVmZmVyOworCQlmb3IgKGkgPSBjID4+IDI7IGktLTspIHsKKwkJCSpkc3QgPSBmYl9yZWFkbChzcmMrKyk7CisJCQkqZHN0ID0KKwkJCSAgICAoKmRzdCAmIDB4ZmYwMGZmMDAgPj4gOCkgfAorCQkJICAgICgqZHN0ICYgMHgwMGZmMDBmZiA8PCA4KTsKKwkJCWRzdCsrOworCQl9CisJCWlmIChjICYgMykgeworCQkJdTggKmRzdDggPSAodTggKikgZHN0OworCQkJdTggX19pb21lbSAqc3JjOCA9ICh1OCBfX2lvbWVtICopIHNyYzsKKworCQkJZm9yIChpID0gYyAmIDM7IGktLTspIHsKKwkJCQlpZiAoaSAmIDEpIHsKKwkJCQkJKmRzdDgrKyA9IGZiX3JlYWRiKCsrc3JjOCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJKmRzdDgrKyA9IGZiX3JlYWRiKC0tc3JjOCk7CisJCQkJCXNyYzggKz0gMjsKKwkJCQl9CisJCQl9CisJCQlzcmMgPSAodTMyIF9faW9tZW0gKikgc3JjODsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZmZXIsIGMpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJKnBwb3MgKz0gYzsKKwkJYnVmICs9IGM7CisJCWNudCArPSBjOworCQljb3VudCAtPSBjOworCX0KKworCWtmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gKGVycikgPyBlcnIgOiBjbnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzbXRjZmJfd3JpdGUoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkgICAgIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBsb25nIHAgPSAqcHBvczsKKworCXUzMiAqYnVmZmVyLCAqc3JjOworCXUzMiBfX2lvbWVtICpkc3Q7CisJaW50IGMsIGksIGNudCA9IDAsIGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOworCisJaWYgKCFpbmZvIHx8ICFpbmZvLT5zY3JlZW5fYmFzZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybiAtRVBFUk07CisKKwl0b3RhbF9zaXplID0gaW5mby0+c2NyZWVuX3NpemU7CisKKwlpZiAodG90YWxfc2l6ZSA9PSAwKQorCQl0b3RhbF9zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOworCisJaWYgKHAgPiB0b3RhbF9zaXplKQorCQlyZXR1cm4gLUVGQklHOworCisJaWYgKGNvdW50ID4gdG90YWxfc2l6ZSkgeworCQllcnIgPSAtRUZCSUc7CisJCWNvdW50ID0gdG90YWxfc2l6ZTsKKwl9CisKKwlpZiAoY291bnQgKyBwID4gdG90YWxfc2l6ZSkgeworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FTk9TUEM7CisKKwkJY291bnQgPSB0b3RhbF9zaXplIC0gcDsKKwl9CisKKwlidWZmZXIgPSBrbWFsbG9jKChjb3VudCA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJZHN0ID0gKHUzMiBfX2lvbWVtICopIChpbmZvLT5zY3JlZW5fYmFzZSArIHApOworCisJaWYgKGluZm8tPmZib3BzLT5mYl9zeW5jKQorCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyhpbmZvKTsKKworCXdoaWxlIChjb3VudCkgeworCQljID0gKGNvdW50ID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IGNvdW50OworCQlzcmMgPSBidWZmZXI7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHNyYywgYnVmLCBjKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJZm9yIChpID0gYyA+PiAyOyBpLS07KSB7CisJCQlmYl93cml0ZWwoKCpzcmMgJiAweGZmMDBmZjAwID4+IDgpIHwKKwkJCQkgICgqc3JjICYgMHgwMGZmMDBmZiA8PCA4KSwgZHN0KyspOworCQkJc3JjKys7CisJCX0KKwkJaWYgKGMgJiAzKSB7CisJCQl1OCAqc3JjOCA9ICh1OCAqKSBzcmM7CisJCQl1OCBfX2lvbWVtICpkc3Q4ID0gKHU4IF9faW9tZW0gKikgZHN0OworCisJCQlmb3IgKGkgPSBjICYgMzsgaS0tOykgeworCQkJCWlmIChpICYgMSkgeworCQkJCQlmYl93cml0ZWIoKnNyYzgrKywgKytkc3Q4KTsKKwkJCQl9IGVsc2UgeworCQkJCQlmYl93cml0ZWIoKnNyYzgrKywgLS1kc3Q4KTsKKwkJCQkJZHN0OCArPSAyOworCQkJCX0KKwkJCX0KKwkJCWRzdCA9ICh1MzIgX19pb21lbSAqKSBkc3Q4OworCQl9CisKKwkJKnBwb3MgKz0gYzsKKwkJYnVmICs9IGM7CisJCWNudCArPSBjOworCQljb3VudCAtPSBjOworCX0KKworCWtmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gKGNudCkgPyBjbnQgOiBlcnI7Cit9CisjZW5kaWYJLyogISBfX0JJR19FTkRJQU4gKi8KKworI2luY2x1ZGUgInNtdGMyZC5jIgorCit2b2lkIHNtdGNmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKQoreworCXN0cnVjdCBwYXJfaW5mbyAqcCA9IChzdHJ1Y3QgcGFyX2luZm8gKilpbmZvLT5wYXI7CisKKwlpZiAoc210Y18yRGFjY2VsZXJhdGlvbikgeworCQlpZiAoIWFyZWEtPndpZHRoIHx8ICFhcmVhLT5oZWlnaHQpCisJCQlyZXR1cm47CisKKwkJZGVDb3B5KHAtPkJhc2VBZGRyZXNzSW5WUkFNLCAwLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCisJCSAgICAgICBhcmVhLT5keCwgYXJlYS0+ZHksIGFyZWEtPndpZHRoLCBhcmVhLT5oZWlnaHQsCisJCSAgICAgICBwLT5CYXNlQWRkcmVzc0luVlJBTSwgMCwgYXJlYS0+c3gsIGFyZWEtPnN5LCAwLCAweEMpOworCisJfSBlbHNlCisJCWNmYl9jb3B5YXJlYShpbmZvLCBhcmVhKTsKK30KKwordm9pZCBzbXRjZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKK3sKKwlzdHJ1Y3QgcGFyX2luZm8gKnAgPSAoc3RydWN0IHBhcl9pbmZvICopaW5mby0+cGFyOworCisJaWYgKHNtdGNfMkRhY2NlbGVyYXRpb24pIHsKKwkJaWYgKCFyZWN0LT53aWR0aCB8fCAhcmVjdC0+aGVpZ2h0KQorCQkJcmV0dXJuOworCQlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID49IDI0KQorCQkJZGVGaWxsUmVjdChwLT5CYXNlQWRkcmVzc0luVlJBTSwgMCwgcmVjdC0+ZHggKiAzLAorCQkJCSAgIHJlY3QtPmR5ICogMywgcmVjdC0+d2lkdGggKiAzLCByZWN0LT5oZWlnaHQsCisJCQkJICAgcmVjdC0+Y29sb3IpOworCQllbHNlCisJCQlkZUZpbGxSZWN0KHAtPkJhc2VBZGRyZXNzSW5WUkFNLCAwLCByZWN0LT5keCwgcmVjdC0+ZHksCisJCQkJICAgcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCwgcmVjdC0+Y29sb3IpOworCX0gZWxzZQorCQljZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7Cit9CisKK3ZvaWQgc210Y2ZiX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKK3sKKwlzdHJ1Y3QgcGFyX2luZm8gKnAgPSAoc3RydWN0IHBhcl9pbmZvICopaW5mby0+cGFyOworCXUzMiBiZ19jb2wgPSAwLCBmZ19jb2wgPSAwOworCisJaWYgKChzbXRjXzJEYWNjZWxlcmF0aW9uKSAmJiAoaW1hZ2UtPmRlcHRoID09IDEpKSB7CisJCWlmIChzbXRjX2RlX2J1c3kpCisJCQlkZVdhaXRGb3JOb3RCdXN5KCk7CisKKwkJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSA4OgorCQkJYmdfY29sID0gaW1hZ2UtPmJnX2NvbG9yOworCQkJZmdfY29sID0gaW1hZ2UtPmZnX2NvbG9yOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQliZ19jb2wgPQorCQkJICAgICgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5iZ19jb2xvcl07CisJCQlmZ19jb2wgPQorCQkJICAgICgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5mZ19jb2xvcl07CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCWJnX2NvbCA9CisJCQkgICAgKCh1MzIgKikgKGluZm8tPnBzZXVkb19wYWxldHRlKSlbaW1hZ2UtPmJnX2NvbG9yXTsKKwkJCWZnX2NvbCA9CisJCQkgICAgKCh1MzIgKikgKGluZm8tPnBzZXVkb19wYWxldHRlKSlbaW1hZ2UtPmZnX2NvbG9yXTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVTeXN0ZW1NZW0yVmlkZW9NZW1Nb25vQmx0KAorCQkJaW1hZ2UtPmRhdGEsCisJCQlpbWFnZS0+d2lkdGggLyA4LAorCQkJMCwKKwkJCXAtPkJhc2VBZGRyZXNzSW5WUkFNLAorCQkJMCwKKwkJCTAsCisJCQlpbWFnZS0+ZHgsIGltYWdlLT5keSwKKwkJCWltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCwKKwkJCWZnX2NvbCwgYmdfY29sLAorCQkJMHgwQyk7CisKKwl9IGVsc2UKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIHNtdGNmYl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX3NldGNvbHJlZyA9IHNtdGNfc2V0Y29scmVnLAorCS5mYl9ibGFuayA9IHNtdGNmYl9ibGFuaywKKwkuZmJfZmlsbHJlY3QgPSBzbXRjZmJfZmlsbHJlY3QsCisJLmZiX2ltYWdlYmxpdCA9IHNtdGNmYl9pbWFnZWJsaXQsCisJLmZiX2NvcHlhcmVhID0gc210Y2ZiX2NvcHlhcmVhLAorI2lmZGVmIF9fQklHX0VORElBTgorCS5mYl9yZWFkID0gc210Y2ZiX3JlYWQsCisJLmZiX3dyaXRlID0gc210Y2ZiX3dyaXRlLAorI2VuZGlmCisKK307CisKK3ZvaWQgc210Y2ZiX3NldG1vZGUoc3RydWN0IHNtdGNmYl9pbmZvICpzZmIpCit7CisJc3dpdGNoIChzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgMzI6CisJCXNmYi0+ZmIuZml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCXNmYi0+ZmIuZml4LmxpbmVfbGVuZ3RoID0gc2ZiLT5mYi52YXIueHJlcyAqIDQ7CisJCXNmYi0+ZmIudmFyLnJlZC5sZW5ndGggPSA4OworCQlzZmItPmZiLnZhci5ncmVlbi5sZW5ndGggPSA4OworCQlzZmItPmZiLnZhci5ibHVlLmxlbmd0aCA9IDg7CisJCXNmYi0+ZmIudmFyLnJlZC5vZmZzZXQgPSAxNjsKKwkJc2ZiLT5mYi52YXIuZ3JlZW4ub2Zmc2V0ID0gODsKKwkJc2ZiLT5mYi52YXIuYmx1ZS5vZmZzZXQgPSAwOworCisJCWJyZWFrOworCWNhc2UgODoKKwkJc2ZiLT5mYi5maXgudmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCQlzZmItPmZiLmZpeC5saW5lX2xlbmd0aCA9IHNmYi0+ZmIudmFyLnhyZXM7CisJCXNmYi0+ZmIudmFyLnJlZC5vZmZzZXQgPSA1OworCQlzZmItPmZiLnZhci5yZWQubGVuZ3RoID0gMzsKKwkJc2ZiLT5mYi52YXIuZ3JlZW4ub2Zmc2V0ID0gMjsKKwkJc2ZiLT5mYi52YXIuZ3JlZW4ubGVuZ3RoID0gMzsKKwkJc2ZiLT5mYi52YXIuYmx1ZS5vZmZzZXQgPSAwOworCQlzZmItPmZiLnZhci5ibHVlLmxlbmd0aCA9IDI7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXNmYi0+ZmIuZml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCXNmYi0+ZmIuZml4LmxpbmVfbGVuZ3RoID0gc2ZiLT5mYi52YXIueHJlcyAqIDM7CisJCXNmYi0+ZmIudmFyLnJlZC5sZW5ndGggPSA4OworCQlzZmItPmZiLnZhci5ncmVlbi5sZW5ndGggPSA4OworCQlzZmItPmZiLnZhci5ibHVlLmxlbmd0aCA9IDg7CisKKwkJc2ZiLT5mYi52YXIucmVkLm9mZnNldCA9IDE2OworCQlzZmItPmZiLnZhci5ncmVlbi5vZmZzZXQgPSA4OworCQlzZmItPmZiLnZhci5ibHVlLm9mZnNldCA9IDA7CisKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwlkZWZhdWx0OgorCQlzZmItPmZiLmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCQlzZmItPmZiLmZpeC5saW5lX2xlbmd0aCA9IHNmYi0+ZmIudmFyLnhyZXMgKiAyOworCisJCXNmYi0+ZmIudmFyLnJlZC5sZW5ndGggPSA1OworCQlzZmItPmZiLnZhci5ncmVlbi5sZW5ndGggPSA2OworCQlzZmItPmZiLnZhci5ibHVlLmxlbmd0aCA9IDU7CisKKwkJc2ZiLT5mYi52YXIucmVkLm9mZnNldCA9IDExOworCQlzZmItPmZiLnZhci5ncmVlbi5vZmZzZXQgPSA1OworCQlzZmItPmZiLnZhci5ibHVlLm9mZnNldCA9IDA7CisKKwkJYnJlYWs7CisJfQorCisJaHcud2lkdGggPSBzZmItPmZiLnZhci54cmVzOworCWh3LmhlaWdodCA9IHNmYi0+ZmIudmFyLnlyZXM7CisJaHcuaHogPSA2MDsKKwlzbXRjX3NldF90aW1pbmcoc2ZiLCAmaHcpOworCWlmIChzbXRjXzJEYWNjZWxlcmF0aW9uKSB7CisJCXByaW50aygiMkQgYWNjZWxlcmF0aW9uIGVuYWJsZWQhXG4iKTsKKwkJLyogSW5pdCBzbXRjIGRyYXdpbmcgZW5naW5lICovCisJCWRlSW5pdChzZmItPmZiLnZhci54cmVzLCBzZmItPmZiLnZhci55cmVzLAorCQkJCXNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsKTsKKwl9Cit9CisKKy8qCisgKiBBbGxvYyBzdHJ1Y3Qgc210Y2ZiX2luZm8gYW5kIGFzc2lnbiB0aGUgZGVmYXVsdCB2YWx1ZQorICovCitzdGF0aWMgc3RydWN0IHNtdGNmYl9pbmZvICpzbXRjX2FsbG9jX2ZiX2luZm8oc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJCQljaGFyICpuYW1lKQoreworCXN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiOworCisJc2ZiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNtdGNmYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNmYikKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoc2ZiLCAwLCBzaXplb2Yoc3RydWN0IHNtdGNmYl9pbmZvKSk7CisKKwlzZmItPmN1cnJjb24gPSAtMTsKKwlzZmItPmRldiA9IGRldjsKKworCS8qKiogSW5pdCBzZmItPmZiIHdpdGggZGVmYXVsdCB2YWx1ZSAqKiovCisJc2ZiLT5mYi5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisJc2ZiLT5mYi5mYm9wcyA9ICZzbXRjZmJfb3BzOworCXNmYi0+ZmIudmFyID0gc210Y2ZiX3ZhcjsKKwlzZmItPmZiLmZpeCA9IHNtdGNmYl9maXg7CisKKwlzdHJjcHkoc2ZiLT5mYi5maXguaWQsIG5hbWUpOworCisJc2ZiLT5mYi5maXgudHlwZSA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKKwlzZmItPmZiLmZpeC50eXBlX2F1eCA9IDA7CisJc2ZiLT5mYi5maXgueHBhbnN0ZXAgPSAwOworCXNmYi0+ZmIuZml4LnlwYW5zdGVwID0gMDsKKwlzZmItPmZiLmZpeC55d3JhcHN0ZXAgPSAwOworCXNmYi0+ZmIuZml4LmFjY2VsID0gRkJfQUNDRUxfU01JX0xZTlg7CisKKwlzZmItPmZiLnZhci5ub25zdGQgPSAwOworCXNmYi0+ZmIudmFyLmFjdGl2YXRlID0gRkJfQUNUSVZBVEVfTk9XOworCXNmYi0+ZmIudmFyLmhlaWdodCA9IC0xOworCXNmYi0+ZmIudmFyLndpZHRoID0gLTE7CisJLyogdGV4dCBtb2RlIGFjY2VsZXJhdGlvbiAqLworCXNmYi0+ZmIudmFyLmFjY2VsX2ZsYWdzID0gRkJfQUNDRUxGX1RFWFQ7CisJc2ZiLT5mYi52YXIudm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCXNmYi0+ZmIucGFyID0gJmh3OworCXNmYi0+ZmIucHNldWRvX3BhbGV0dGUgPSBjb2xyZWc7CisKKwlyZXR1cm4gc2ZiOworfQorCisvKgorICogVW5tYXAgaW4gdGhlIG1lbW9yeSBtYXBwZWQgSU8gcmVnaXN0ZXJzCisgKi8KKworc3RhdGljIHZvaWQgc210Y191bm1hcF9tbWlvKHN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiKQoreworCWlmIChzZmIgJiYgc210Y19SZWdCYXNlQWRkcmVzcykKKwkJc210Y19SZWdCYXNlQWRkcmVzcyA9IE5VTEw7Cit9CisKKy8qCisgKiBNYXAgaW4gdGhlIHNjcmVlbiBtZW1vcnkKKyAqLworCitzdGF0aWMgaW50IHNtdGNfbWFwX3NtZW0oc3RydWN0IHNtdGNmYl9pbmZvICpzZmIsCisJCXN0cnVjdCBwY2lfZGV2ICpkZXYsIHVfbG9uZyBzbWVtX2xlbikKK3sKKwlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMzIpIHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJc2ZiLT5mYi5maXguc21lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApCisJCQkrIDB4ODAwMDAwOworI2Vsc2UKKwkJc2ZiLT5mYi5maXguc21lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworI2VuZGlmCisJfSBlbHNlIHsKKwkJc2ZiLT5mYi5maXguc21lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworCX0KKworCXNmYi0+ZmIuZml4LnNtZW1fbGVuID0gc21lbV9sZW47CisKKwlzZmItPmZiLnNjcmVlbl9iYXNlID0gc210Y19WUkFNQmFzZUFkZHJlc3M7CisKKwlpZiAoIXNmYi0+ZmIuc2NyZWVuX2Jhc2UpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVuYWJsZSB0byBtYXAgc2NyZWVuIG1lbW9yeVxuIiwKKwkJCQlzZmItPmZiLmZpeC5pZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVW5tYXAgaW4gdGhlIHNjcmVlbiBtZW1vcnkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtdGNfdW5tYXBfc21lbShzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYikKK3sKKwlpZiAoc2ZiICYmIHNmYi0+ZmIuc2NyZWVuX2Jhc2UpIHsKKwkJaW91bm1hcChzZmItPmZiLnNjcmVlbl9iYXNlKTsKKwkJc2ZiLT5mYi5zY3JlZW5fYmFzZSA9IE5VTEw7CisJfQorfQorCisvKgorICogV2UgbmVlZCB0byB3YWtlIHVwIHRoZSBMeW54RU0rLCBhbmQgbWFrZSBzdXJlIGl0cyBpbiBsaW5lYXIgbWVtb3J5IG1vZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbTd4eF9pbml0X2h3KHZvaWQpCit7CisJb3V0Yl9wKDB4MTgsIDB4M2M0KTsKKwlvdXRiX3AoMHgxMSwgMHgzYzUpOworfQorCitzdGF0aWMgdm9pZCBzbXRjX2ZyZWVfZmJfaW5mbyhzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYikKK3sKKwlpZiAoc2ZiKSB7CisJCWZiX2FsbG9jX2NtYXAoJnNmYi0+ZmIuY21hcCwgMCwgMCk7CisJCWtmcmVlKHNmYik7CisJfQorfQorCisvKgorICoJc203MTJ2Z2Ffc2V0dXAgLSBwcm9jZXNzIGNvbW1hbmQgbGluZSBvcHRpb25zLCBnZXQgdmdhIHBhcmFtZXRlcgorICoJQG9wdGlvbnM6IHN0cmluZyBvZiBvcHRpb25zCisgKglSZXR1cm5zIHplcm8uCisgKgorICovCitzdGF0aWMgaW50IF9faW5pdCBfX21heWJlX3VudXNlZCBzbTcxMnZnYV9zZXR1cChjaGFyICpvcHRpb25zKQoreworCWludCBpbmRleDsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpIHsKKwkJc21kYmcoIlxuIE5vIHZnYSBwYXJhbWV0ZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbXRjX3NjcmVlbl9pbmZvLmxmYl93aWR0aCA9IDA7CisJc210Y19zY3JlZW5faW5mby5sZmJfaGVpZ2h0ID0gMDsKKwlzbXRjX3NjcmVlbl9pbmZvLmxmYl9kZXB0aCA9IDA7CisKKwlzbWRiZygiXG5zbTcxMnZnYV9zZXR1cCA9ICVzXG4iLCBvcHRpb25zKTsKKworCWZvciAoaW5kZXggPSAwOworCSAgICAgaW5kZXggPCAoc2l6ZW9mKHZlc2FfbW9kZSkgLyBzaXplb2Yoc3RydWN0IHZlc2FfbW9kZV90YWJsZSkpOworCSAgICAgaW5kZXgrKykgeworCQlpZiAoc3Ryc3RyKG9wdGlvbnMsIHZlc2FfbW9kZVtpbmRleF0ubW9kZV9pbmRleCkpIHsKKwkJCXNtdGNfc2NyZWVuX2luZm8ubGZiX3dpZHRoID0gdmVzYV9tb2RlW2luZGV4XS5sZmJfd2lkdGg7CisJCQlzbXRjX3NjcmVlbl9pbmZvLmxmYl9oZWlnaHQgPQorCQkJCQl2ZXNhX21vZGVbaW5kZXhdLmxmYl9oZWlnaHQ7CisJCQlzbXRjX3NjcmVlbl9pbmZvLmxmYl9kZXB0aCA9IHZlc2FfbW9kZVtpbmRleF0ubGZiX2RlcHRoOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CitfX3NldHVwKCJ2Z2E9Iiwgc203MTJ2Z2Ffc2V0dXApOworCisvKiBKYXNvbiAoMDgvMTMvMjAwOSkKKyAqIE9yaWdpbmFsIGluaXQgZnVuY3Rpb24gY2hhbmdlZCB0byBwcm9iZSBtZXRob2QgdG8gYmUgdXNlZCBieSBwY2lfZHJ2CisgKiBwcm9jZXNzIHVzZWQgdG8gZGV0ZWN0IGNoaXBzIHJlcGxhY2VkIHdpdGgga2VybmVsIHByb2Nlc3MgaW4gcGNpX2RydgorICovCitzdGF0aWMgaW50IF9faW5pdCBzbXRjZmJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IHNtdGNmYl9pbmZvICpzZmI7CisJdV9sb25nIHNtZW1fc2l6ZSA9IDB4MDA4MDAwMDA7CS8qIGRlZmF1bHQgOE1CICovCisJY2hhciBuYW1lWzE2XTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgcEZyYW1lYnVmZmVyUGh5c2ljYWw7CisKKwlwcmludGsoS0VSTl9JTkZPCisJCSJTaWxpY29uIE1vdGlvbiBkaXNwbGF5IGRyaXZlciAiIFNNVENfTElOVVhfRkJfVkVSU0lPTiAiXG4iKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwkvKiBlbmFibGUgU01UQyBjaGlwICovCisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IC1FTk9NRU07CisKKwlody5jaGlwSUQgPSBlbnQtPmRldmljZTsKKwlzcHJpbnRmKG5hbWUsICJzbSVYZmIiLCBody5jaGlwSUQpOworCisJc2ZiID0gc210Y19hbGxvY19mYl9pbmZvKHBkZXYsIG5hbWUpOworCisJaWYgKCFzZmIpCisJCWdvdG8gZmFpbGVkOworCS8qIEphc29uICgwOC8xMy8yMDA5KQorCSAqIFN0b3JlIGZiX2luZm8gdG8gYmUgZnVydGhlciB1c2VkIHdoZW4gc3VzcGVuZGluZyBhbmQgcmVzdW1pbmcKKwkgKi8KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgc2ZiKTsKKworCXNtN3h4X2luaXRfaHcoKTsKKworCS8qZ2V0IG1vZGUgcGFyYW1ldGVyIGZyb20gc210Y19zY3JlZW5faW5mbyAqLworCWlmIChzbXRjX3NjcmVlbl9pbmZvLmxmYl93aWR0aCAhPSAwKSB7CisJCXNmYi0+ZmIudmFyLnhyZXMgPSBzbXRjX3NjcmVlbl9pbmZvLmxmYl93aWR0aDsKKwkJc2ZiLT5mYi52YXIueXJlcyA9IHNtdGNfc2NyZWVuX2luZm8ubGZiX2hlaWdodDsKKwkJc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPSBzbXRjX3NjcmVlbl9pbmZvLmxmYl9kZXB0aDsKKwl9IGVsc2UgeworCQkvKiBkZWZhdWx0IHJlc29sdXRpb24gMTAyNHg2MDAgMTZiaXQgbW9kZSAqLworCQlzZmItPmZiLnZhci54cmVzID0gU0NSRUVOX1hfUkVTOworCQlzZmItPmZiLnZhci55cmVzID0gU0NSRUVOX1lfUkVTOworCQlzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9IFNDUkVFTl9CUFA7CisJfQorCisjaWZkZWYgX19CSUdfRU5ESUFOCisJaWYgKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID09IDI0KQorCQlzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9IChzbXRjX3NjcmVlbl9pbmZvLmxmYl9kZXB0aCA9IDMyKTsKKyNlbmRpZgorCS8qIE1hcCBhZGRyZXNzIGFuZCBtZW1vcnkgZGV0ZWN0aW9uICovCisJcEZyYW1lYnVmZmVyUGh5c2ljYWwgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmaHcuY2hpcFJldklEKTsKKworCXN3aXRjaCAoaHcuY2hpcElEKSB7CisJY2FzZSAweDcxMDoKKwljYXNlIDB4NzEyOgorCQlzZmItPmZiLmZpeC5tbWlvX3N0YXJ0ID0gcEZyYW1lYnVmZmVyUGh5c2ljYWwgKyAweDAwNDAwMDAwOworCQlzZmItPmZiLmZpeC5tbWlvX2xlbiA9IDB4MDA0MDAwMDA7CisJCXNtZW1fc2l6ZSA9IFNNNzEyX1ZJREVPTUVNT1JZU0laRTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJaHcubV9wTEZCID0gKHNtdGNfVlJBTUJhc2VBZGRyZXNzID0KKwkJICAgIGlvcmVtYXAocEZyYW1lYnVmZmVyUGh5c2ljYWwsIDB4MDBjMDAwMDApKTsKKyNlbHNlCisJCWh3Lm1fcExGQiA9IChzbXRjX1ZSQU1CYXNlQWRkcmVzcyA9CisJCSAgICBpb3JlbWFwKHBGcmFtZWJ1ZmZlclBoeXNpY2FsLCAweDAwODAwMDAwKSk7CisjZW5kaWYKKwkJaHcubV9wTU1JTyA9IChzbXRjX1JlZ0Jhc2VBZGRyZXNzID0KKwkJICAgIHNtdGNfVlJBTUJhc2VBZGRyZXNzICsgMHgwMDcwMDAwMCk7CisJCXNtdGNfMkRCYXNlQWRkcmVzcyA9IChody5tX3BEUFIgPQorCQkgICAgc210Y19WUkFNQmFzZUFkZHJlc3MgKyAweDAwNDA4MDAwKTsKKwkJc210Y18yRGRhdGFwb3J0ID0gc210Y19WUkFNQmFzZUFkZHJlc3MgKyBERV9EQVRBX1BPUlRfNzEyOworCQlody5tX3BWUFIgPSBody5tX3BMRkIgKyAweDAwNDBjMDAwOworI2lmZGVmIF9fQklHX0VORElBTgorCQlpZiAoc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gMzIpIHsKKwkJCXNtdGNfVlJBTUJhc2VBZGRyZXNzICs9IDB4ODAwMDAwOworCQkJaHcubV9wTEZCICs9IDB4ODAwMDAwOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJcbnNtdGNfVlJBTUJhc2VBZGRyZXNzPSVwIGh3Lm1fcExGQj0lcFxuIiwKKwkJCQkJc210Y19WUkFNQmFzZUFkZHJlc3MsIGh3Lm1fcExGQik7CisJCX0KKyNlbmRpZgorCQlpZiAoIXNtdGNfUmVnQmFzZUFkZHJlc3MpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IHVuYWJsZSB0byBtYXAgbWVtb3J5IG1hcHBlZCBJT1xuIiwKKwkJCQlzZmItPmZiLmZpeC5pZCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCS8qIHNldCBNQ0xLID0gMTQuMzE4MTggKiAoMHgxNiAvIDB4MikgKi8KKwkJc210Y19zZXF3KDB4NmEsIDB4MTYpOworCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7CisJCXNtdGNfc2VxdygweDYyLCAweDNlKTsKKwkJLyogZW5hYmxlIFBDSSBidXJzdCAqLworCQlzbXRjX3NlcXcoMHgxNywgMHgyMCk7CisJCS8qIGVuYWJsZSB3b3JkIHN3YXAgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJaWYgKHNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsID09IDMyKQorCQkJc210Y19zZXF3KDB4MTcsIDB4MzApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZCX1NNN1hYX0FDQ0VMCisJCXNtdGNfMkRhY2NlbGVyYXRpb24gPSAxOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgMHg3MjA6CisJCXNmYi0+ZmIuZml4Lm1taW9fc3RhcnQgPSBwRnJhbWVidWZmZXJQaHlzaWNhbDsKKwkJc2ZiLT5mYi5maXgubW1pb19sZW4gPSAweDAwMjAwMDAwOworCQlzbWVtX3NpemUgPSBTTTcyMl9WSURFT01FTU9SWVNJWkU7CisJCXNtdGNfMkRCYXNlQWRkcmVzcyA9IChody5tX3BEUFIgPQorCQkgICAgaW9yZW1hcChwRnJhbWVidWZmZXJQaHlzaWNhbCwgMHgwMGEwMDAwMCkpOworCQlody5tX3BMRkIgPSAoc210Y19WUkFNQmFzZUFkZHJlc3MgPQorCQkgICAgc210Y18yREJhc2VBZGRyZXNzICsgMHgwMDIwMDAwMCk7CisJCWh3Lm1fcE1NSU8gPSAoc210Y19SZWdCYXNlQWRkcmVzcyA9CisJCSAgICBzbXRjXzJEQmFzZUFkZHJlc3MgKyAweDAwMGMwMDAwKTsKKwkJc210Y18yRGRhdGFwb3J0ID0gc210Y18yREJhc2VBZGRyZXNzICsgREVfREFUQV9QT1JUXzcyMjsKKwkJaHcubV9wVlBSID0gc210Y18yREJhc2VBZGRyZXNzICsgMHg4MDA7CisKKwkJc210Y19zZXF3KDB4NjIsIDB4ZmYpOworCQlzbXRjX3NlcXcoMHg2YSwgMHgwZCk7CisJCXNtdGNfc2VxdygweDZiLCAweDAyKTsKKwkJc210Y18yRGFjY2VsZXJhdGlvbiA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8KKwkJIk5vIHZhbGlkIFNpbGljb24gTW90aW9uIGRpc3BsYXkgY2hpcCB3YXMgZGV0ZWN0ZWQhXG4iKTsKKworCQlzbXRjX2ZyZWVfZmJfaW5mbyhzZmIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGNhbiBzdXBwb3J0IDMyIGJwcCAqLworCWlmICgxNSA9PSBzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCkKKwkJc2ZiLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPSAxNjsKKworCXNmYi0+ZmIudmFyLnhyZXNfdmlydHVhbCA9IHNmYi0+ZmIudmFyLnhyZXM7CisJc2ZiLT5mYi52YXIueXJlc192aXJ0dWFsID0gc2ZiLT5mYi52YXIueXJlczsKKwllcnIgPSBzbXRjX21hcF9zbWVtKHNmYiwgcGRldiwgc21lbV9zaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxlZDsKKworCXNtdGNmYl9zZXRtb2RlKHNmYik7CisJLyogUHJpbWFyeSBkaXNwbGF5IHN0YXJ0aW5nIGZyb20gMCBwb3N0aW9uICovCisJaHcuQmFzZUFkZHJlc3NJblZSQU0gPSAwOworCXNmYi0+ZmIucGFyID0gJmh3OworCisJZXJyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoJnNmYi0+ZmIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWxlZDsKKworCXByaW50ayhLRVJOX0lORk8gIlNpbGljb24gTW90aW9uIFNNJVggUmV2JVggcHJpbWFyeSBkaXNwbGF5IG1vZGUiCisJCQkiJWR4JWQtJWQgSW5pdCBDb21wbGV0ZS5cbiIsIGh3LmNoaXBJRCwgaHcuY2hpcFJldklELAorCQkJc2ZiLT5mYi52YXIueHJlcywgc2ZiLT5mYi52YXIueXJlcywKKwkJCXNmYi0+ZmIudmFyLmJpdHNfcGVyX3BpeGVsKTsKKworCXJldHVybiAwOworCisgZmFpbGVkOgorCXByaW50ayhLRVJOX0lORk8gIlNpbGljb24gTW90aW9uLCBJbmMuICBwcmltYXJ5IGRpc3BsYXkgaW5pdCBmYWlsXG4iKTsKKworCXNtdGNfdW5tYXBfc21lbShzZmIpOworCXNtdGNfdW5tYXBfbW1pbyhzZmIpOworCXNtdGNfZnJlZV9mYl9pbmZvKHNmYik7CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qIEphc29uICgwOC8xMS8yMDA5KSBQQ0lfRFJWIHdyYXBwZXIgZXNzZW50aWFsIHN0cnVjdHMgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbXRjZmJfcGNpX3RhYmxlW10gPSB7CisJezB4MTI2ZiwgMHg3MTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsweDEyNmYsIDB4NzEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7MHgxMjZmLCAweDcyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezAsfQorfTsKKworCisvKiBKYXNvbiAoMDgvMTQvMjAwOSkKKyAqIGRvIHNvbWUgY2xlYW4gdXAgd2hlbiB0aGUgZHJpdmVyIG1vZHVsZSBpcyByZW1vdmVkCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbXRjZmJfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKKworCXNmYiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJc210Y191bm1hcF9zbWVtKHNmYik7CisJc210Y191bm1hcF9tbWlvKHNmYik7CisJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmc2ZiLT5mYik7CisJc210Y19mcmVlX2ZiX2luZm8oc2ZiKTsKK30KKworLyogSmFzb24gKDA4LzE0LzIwMDkpCisgKiBzdXNwZW5kIGZ1bmN0aW9uLCBjYWxsZWQgd2hlbiB0aGUgc3VzcGVuZCBldmVudCBpcyB0cmlnZ2VyZWQKKyAqLworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBzbXRjZmJfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IG1zZykKK3sKKwlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKKwlpbnQgcmV0djsKKworCXNmYiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qIHNldCB0aGUgaHcgaW4gc2xlZXAgbW9kZSB1c2UgZXh0ZXJuZWwgY2xvY2sgYW5kIHNlbGYgbWVtb3J5IHJlZnJlc2gKKwkgKiBzbyB0aGF0IHdlIGNhbiB0dXJuIG9mZiBpbnRlcm5hbCBQTExzIGxhdGVyIG9uCisJICovCisJc210Y19zZXF3KDB4MjAsIChzbXRjX3NlcXIoMHgyMCkgfCAweGMwKSk7CisJc210Y19zZXF3KDB4NjksIChzbXRjX3NlcXIoMHg2OSkgJiAweGY3KSk7CisKKwlzd2l0Y2ggKG1zZy5ldmVudCkgeworCWNhc2UgUE1fRVZFTlRfRlJFRVpFOgorCWNhc2UgUE1fRVZFTlRfUFJFVEhBVzoKKwkJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gbXNnOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB3aGVuIGRvaW5nIHN1c3BlbmQsIGNhbGwgZmIgYXBpcyBhbmQgcGNpIGFwaXMgKi8KKwlpZiAobXNnLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKKwkJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCQlmYl9zZXRfc3VzcGVuZCgmc2ZiLT5mYiwgMSk7CisJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJcmV0diA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHYgPSBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIG1zZyk7CisJCXJldHYgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHJldHYpOworCX0KKworCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IG1zZzsKKworCS8qIGFkZGl0aW9uYWx5IHR1cm4gb2ZmIGFsbCBmdW5jdGlvbiBibG9ja3MgaW5jbHVkaW5nIGludGVybmFsIFBMTHMgKi8KKwlzbXRjX3NlcXcoMHgyMSwgMHhmZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBzbXRjZmJfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBzbXRjZmJfaW5mbyAqc2ZiOworCWludCByZXR2OworCisJc2ZiID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogd2hlbiByZXN1bWluZywgcmVzdG9yZSBwY2kgZGF0YSBhbmQgZmIgY3Vyc29yICovCisJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9GUkVFWkUpIHsKKwkJcmV0diA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwkJcmV0diA9IHBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCQlyZXR1cm4gLTE7CisJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCX0KKworCS8qIHJlaW5pdCBoYXJkd2FyZSAqLworCXNtN3h4X2luaXRfaHcoKTsKKwlzd2l0Y2ggKGh3LmNoaXBJRCkgeworCWNhc2UgMHg3MTA6CisJY2FzZSAweDcxMjoKKwkJLyogc2V0IE1DTEsgPSAxNC4zMTgxOCAqICAoMHgxNiAvIDB4MikgKi8KKwkJc210Y19zZXF3KDB4NmEsIDB4MTYpOworCQlzbXRjX3NlcXcoMHg2YiwgMHgwMik7CisJCXNtdGNfc2VxdygweDYyLCAweDNlKTsKKwkJLyogZW5hYmxlIFBDSSBidXJzdCAqLworCQlzbXRjX3NlcXcoMHgxNywgMHgyMCk7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCWlmIChzZmItPmZiLnZhci5iaXRzX3Blcl9waXhlbCA9PSAzMikKKwkJCXNtdGNfc2VxdygweDE3LCAweDMwKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIDB4NzIwOgorCQlzbXRjX3NlcXcoMHg2MiwgMHhmZik7CisJCXNtdGNfc2VxdygweDZhLCAweDBkKTsKKwkJc210Y19zZXF3KDB4NmIsIDB4MDIpOworCQlicmVhazsKKwl9CisKKwlzbXRjX3NlcXcoMHgzNCwgKHNtdGNfc2VxcigweDM0KSB8IDB4YzApKTsKKwlzbXRjX3NlcXcoMHgzMywgKChzbXRjX3NlcXIoMHgzMykgfCAweDA4KSAmIDB4ZmIpKTsKKworCXNtdGNmYl9zZXRtb2RlKHNmYik7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJZmJfc2V0X3N1c3BlbmQoJnNmYi0+ZmIsIDApOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKworCXJldHVybiAwOworfQorCisvKiBKYXNvbiAoMDgvMTMvMjAwOSkKKyAqIHBjaV9kcml2ZXIgc3RydWN0IHVzZWQgdG8gd3JhcCB0aGUgb3JpZ2luYWwgZHJpdmVyCisgKiBzbyB0aGF0IGl0IGNhbiBiZSByZWdpc3RlcmVkIGludG8gdGhlIGtlcm5lbCBhbmQKKyAqIHRoZSBwcm9wZXIgbWV0aG9kIHdvdWxkIGJlIGNhbGxlZCB3aGVuIHN1c3BlbmRpbmcgYW5kIHJlc3VtaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzbXRjZmJfZHJpdmVyID0geworCS5uYW1lID0gInNtdGNmYiIsCisJLmlkX3RhYmxlID0gc210Y2ZiX3BjaV90YWJsZSwKKwkucHJvYmUgPSBzbXRjZmJfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbXRjZmJfcGNpX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBzbXRjZmJfc3VzcGVuZCwKKwkucmVzdW1lID0gc210Y2ZiX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgc210Y2ZiX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc210Y2ZiX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbXRjZmJfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc210Y2ZiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNtdGNmYl9pbml0KTsKK21vZHVsZV9leGl0KHNtdGNmYl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU2lsaWNvbm1vdGlvbiAiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJhbWVidWZmZXIgZHJpdmVyIGZvciBTTUkgR3JhcGhpYyBDYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGNmYi5oIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGNmYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmMzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmgKQEAgLTAsMCArMSw3OTMgQEAKKy8qCisgKiBTaWxpY29uIE1vdGlvbiBTTTcxMiBmcmFtZSBidWZmZXIgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbGljb24gTW90aW9uIFRlY2hub2xvZ3kgQ29ycC4KKyAqIEF1dGhvcnM6CUdlIFdhbmcsIGdld2FuZ0BzaWxpY29ubW90aW9uLmNvbQorICoJIAlCb3lvZCBib3lvZC55YW5nQHNpbGljb25tb3Rpb24uY29tLmNuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IExlbW90ZSwgSW5jLgorICogQXV0aG9yOiBXdSBaaGFuZ2ppbiwgd3V6akBsZW1vdGUuY29tCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBTTVRDX0xJTlVYX0ZCX1ZFUlNJT04JInZlcnNpb24gMC4xMS4yNjE5LjIxLjAxIEp1bHkgMjcsIDIwMDgiCisKKyNkZWZpbmUgTlJfUEFMRVRURSAgICAgICAgMjU2CisjZGVmaW5lIE5SX1JHQiAgICAgICAgICAgIDIKKworI2RlZmluZSBGQl9BQ0NFTF9TTUlfTFlOWCA4OAorCisjaWZkZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIFBDX1ZHQSAgICAgICAgICAgIDAKKyNlbHNlCisjZGVmaW5lIFBDX1ZHQSAgICAgICAgICAgIDEKKyNlbmRpZgorCisjZGVmaW5lIFNDUkVFTl9YX1JFUyAgICAgIDEwMjQKKyNkZWZpbmUgU0NSRUVOX1lfUkVTICAgICAgNjAwCisjZGVmaW5lIFNDUkVFTl9CUFAgICAgICAgIDE2CisKKyNpZm5kZWYgRklFTERfT0ZGU0VUCisjZGVmaW5lIEZJRUxEX09GU0ZFVCh0eXBlLCBmaWVsZCkgXAorCSgodW5zaWduZWQgbG9uZykgKFBVQ0hBUikgJiAoKCh0eXBlICopMCktPmZpZWxkKSkKKyNlbmRpZgorCisvKkFzc3VtZSBTTTcxMiBncmFwaGljcyBjaGlwIGhhcyA0TUIgVlJBTSAqLworI2RlZmluZSBTTTcxMl9WSURFT01FTU9SWVNJWkUJICAweDAwNDAwMDAwCisvKkFzc3VtZSBTTTcyMiBncmFwaGljcyBjaGlwIGhhcyA4TUIgVlJBTSAqLworI2RlZmluZSBTTTcyMl9WSURFT01FTU9SWVNJWkUJICAweDAwODAwMDAwCisKKyNkZWZpbmUgZGFjX3JlZwkoMHgzYzgpCisjZGVmaW5lIGRhY192YWwJKDB4M2M5KQorCitleHRlcm4gY2hhciAqc210Y19SZWdCYXNlQWRkcmVzczsKKyNkZWZpbmUgc210Y19tbWlvd2IoZGF0LCByZWcpCXdyaXRlYihkYXQsIHNtdGNfUmVnQmFzZUFkZHJlc3MgKyByZWcpCisjZGVmaW5lIHNtdGNfbW1pb3d3KGRhdCwgcmVnKQl3cml0ZXcoZGF0LCBzbXRjX1JlZ0Jhc2VBZGRyZXNzICsgcmVnKQorI2RlZmluZSBzbXRjX21taW93bChkYXQsIHJlZykJd3JpdGVsKGRhdCwgc210Y19SZWdCYXNlQWRkcmVzcyArIHJlZykKKworI2RlZmluZSBzbXRjX21taW9yYihyZWcpCXJlYWRiKHNtdGNfUmVnQmFzZUFkZHJlc3MgKyByZWcpCisjZGVmaW5lIHNtdGNfbW1pb3J3KHJlZykJcmVhZHcoc210Y19SZWdCYXNlQWRkcmVzcyArIHJlZykKKyNkZWZpbmUgc210Y19tbWlvcmwocmVnKQlyZWFkbChzbXRjX1JlZ0Jhc2VBZGRyZXNzICsgcmVnKQorCisjZGVmaW5lIFNJWkVfU1IwMF9TUjA0ICAgICAgKDB4MDQgLSAweDAwICsgMSkKKyNkZWZpbmUgU0laRV9TUjEwX1NSMjQgICAgICAoMHgyNCAtIDB4MTAgKyAxKQorI2RlZmluZSBTSVpFX1NSMzBfU1I3NSAgICAgICgweDc1IC0gMHgzMCArIDEpCisjZGVmaW5lIFNJWkVfU1I4MF9TUjkzICAgICAgKDB4OTMgLSAweDgwICsgMSkKKyNkZWZpbmUgU0laRV9TUkEwX1NSQUYgICAgICAoMHhBRiAtIDB4QTAgKyAxKQorI2RlZmluZSBTSVpFX0dSMDBfR1IwOCAgICAgICgweDA4IC0gMHgwMCArIDEpCisjZGVmaW5lIFNJWkVfQVIwMF9BUjE0ICAgICAgKDB4MTQgLSAweDAwICsgMSkKKyNkZWZpbmUgU0laRV9DUjAwX0NSMTggICAgICAoMHgxOCAtIDB4MDAgKyAxKQorI2RlZmluZSBTSVpFX0NSMzBfQ1I0RCAgICAgICgweDREIC0gMHgzMCArIDEpCisjZGVmaW5lIFNJWkVfQ1I5MF9DUkE3ICAgICAgKDB4QTcgLSAweDkwICsgMSkKKyNkZWZpbmUgU0laRV9WUFIJCSgweDZDICsgMSkKKyNkZWZpbmUgU0laRV9EUFIJCSgweDQ0ICsgMSkKKworc3RhdGljIGlubGluZSB2b2lkIHNtdGNfY3J0Y3coaW50IHJlZywgaW50IHZhbCkKK3sKKwlzbXRjX21taW93YihyZWcsIDB4M2Q0KTsKKwlzbXRjX21taW93Yih2YWwsIDB4M2Q1KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc210Y19jcnRjcihpbnQgcmVnKQoreworCXNtdGNfbW1pb3diKHJlZywgMHgzZDQpOworCXJldHVybiBzbXRjX21taW9yYigweDNkNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbXRjX2dycGh3KGludCByZWcsIGludCB2YWwpCit7CisJc210Y19tbWlvd2IocmVnLCAweDNjZSk7CisJc210Y19tbWlvd2IodmFsLCAweDNjZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNtdGNfZ3JwaHIoaW50IHJlZykKK3sKKwlzbXRjX21taW93YihyZWcsIDB4M2NlKTsKKwlyZXR1cm4gc210Y19tbWlvcmIoMHgzY2YpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc210Y19hdHRydyhpbnQgcmVnLCBpbnQgdmFsKQoreworCXNtdGNfbW1pb3JiKDB4M2RhKTsKKwlzbXRjX21taW93YihyZWcsIDB4M2MwKTsKKwlzbXRjX21taW9yYigweDNjMSk7CisJc210Y19tbWlvd2IodmFsLCAweDNjMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbXRjX3NlcXcoaW50IHJlZywgaW50IHZhbCkKK3sKKwlzbXRjX21taW93YihyZWcsIDB4M2M0KTsKKwlzbXRjX21taW93Yih2YWwsIDB4M2M1KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc210Y19zZXFyKGludCByZWcpCit7CisJc210Y19tbWlvd2IocmVnLCAweDNjNCk7CisJcmV0dXJuIHNtdGNfbW1pb3JiKDB4M2M1KTsKK30KKworLyogVGhlIG5leHQgc3RydWN0dXJlIGhvbGRzIGFsbCBpbmZvcm1hdGlvbiByZWxldmFudCBmb3IgYSBzcGVjaWZpYyB2aWRlbyBtb2RlLgorICovCisKK3N0cnVjdCBNb2RlSW5pdCB7CisJaW50IG1tU2l6ZVg7CisJaW50IG1tU2l6ZVk7CisJaW50IGJwcDsKKwlpbnQgaHo7CisJdW5zaWduZWQgY2hhciBJbml0X01JU0M7CisJdW5zaWduZWQgY2hhciBJbml0X1NSMDBfU1IwNFtTSVpFX1NSMDBfU1IwNF07CisJdW5zaWduZWQgY2hhciBJbml0X1NSMTBfU1IyNFtTSVpFX1NSMTBfU1IyNF07CisJdW5zaWduZWQgY2hhciBJbml0X1NSMzBfU1I3NVtTSVpFX1NSMzBfU1I3NV07CisJdW5zaWduZWQgY2hhciBJbml0X1NSODBfU1I5M1tTSVpFX1NSODBfU1I5M107CisJdW5zaWduZWQgY2hhciBJbml0X1NSQTBfU1JBRltTSVpFX1NSQTBfU1JBRl07CisJdW5zaWduZWQgY2hhciBJbml0X0dSMDBfR1IwOFtTSVpFX0dSMDBfR1IwOF07CisJdW5zaWduZWQgY2hhciBJbml0X0FSMDBfQVIxNFtTSVpFX0FSMDBfQVIxNF07CisJdW5zaWduZWQgY2hhciBJbml0X0NSMDBfQ1IxOFtTSVpFX0NSMDBfQ1IxOF07CisJdW5zaWduZWQgY2hhciBJbml0X0NSMzBfQ1I0RFtTSVpFX0NSMzBfQ1I0RF07CisJdW5zaWduZWQgY2hhciBJbml0X0NSOTBfQ1JBN1tTSVpFX0NSOTBfQ1JBN107Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJIFNNNzEyIE1vZGUgdGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBNb2RlSW5pdCBWR0FNb2RlW10gPSB7CisJeworCSAvKiAgbW9kZSMwOiA2NDAgeCA0ODAgIDE2QnBwICA2MEh6ICovCisJIDY0MCwgNDgwLCAxNiwgNjAsCisJIC8qICBJbml0X01JU0MgKi8KKwkgMHhFMywKKwkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KKwkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDAsIDB4MEUsCisJICB9LAorCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCisJICAweEZGLCAweEJFLCAweEVGLCAweEZGLCAweDAwLCAweDBFLCAweDE3LCAweDJDLAorCSAgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4QzQsIDB4MzAsIDB4MDIsIDB4MDEsIDB4MDEsCisJICB9LAorCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCisJICAweDMyLCAweDAzLCAweEEwLCAweDA5LCAweEMwLCAweDMyLCAweDMyLCAweDMyLAorCSAgMHgzMiwgMHgzMiwgMHgzMiwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKKwkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MTgsIDB4MDAsIDB4RkMsCisJICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDMyLCAweDMyLCAweDMyLAorCSAgMHgwNCwgMHgyNCwgMHg2MywgMHg0RiwgMHg1MiwgMHgwQiwgMHhERiwgMHhFQSwKKwkgIDB4MDQsIDB4NTAsIDB4MTksIDB4MzIsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MzIsCisJICAweDAxLCAweDgwLCAweDdFLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHg1MCwgMHgwMywgMHg3NCwgMHgxNCwgMHgwNywgMHg4MiwgMHgwNywgMHgwNCwKKwkgIDB4MDAsIDB4NDUsIDB4MzAsIDB4MzAsIDB4NDAsIDB4MzAsCisJICB9LAorCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCisJICAweEZGLCAweDA3LCAweDAwLCAweDZGLCAweDdGLCAweDdGLCAweEZGLCAweDMyLAorCSAgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGRiwgMHgzMiwgMHgzMiwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICB9LAorCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCisJICAweDAwLCAweEZGLCAweEJGLCAweEZGLCAweEZGLCAweEVELCAweEVELCAweEVELAorCSAgMHg3QiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhFRiwgMHhGRiwgMHhERiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCisJICAweEZGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLworCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisJICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLworCSAgMHg1RiwgMHg0RiwgMHg0RiwgMHgwMCwgMHg1MywgMHgxRiwgMHgwQiwgMHgzRSwKKwkgIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweEVBLCAweDBDLCAweERGLCAweDUwLCAweDQwLCAweERGLCAweDAwLCAweEUzLAorCSAgMHhGRiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4MDMsIDB4MjAsCisJICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweEU3LCAweEZGLCAweEZELAorCSAgMHg1RiwgMHg0RiwgMHgwMCwgMHg1NCwgMHgwMCwgMHgwQiwgMHhERiwgMHgwMCwKKwkgIDB4RUEsIDB4MEMsIDB4MkUsIDB4MDAsIDB4NEYsIDB4REYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCisJICAweDU2LCAweERELCAweDVFLCAweEVBLCAweDg3LCAweDQ0LCAweDhGLCAweDU1LAorCSAgMHgwQSwgMHg4RiwgMHg1NSwgMHgwQSwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKKwkgIDB4MTEsIDB4MTAsIDB4MEIsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MDAsCisJICB9LAorCSB9LAorCXsKKwkgLyogIG1vZGUjMTogNjQwIHggNDgwICAyNEJwcCAgNjBIeiAqLworCSA2NDAsIDQ4MCwgMjQsIDYwLAorCSAvKiAgSW5pdF9NSVNDICovCisJIDB4RTMsCisJIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCisJICAweDAzLCAweDAxLCAweDBGLCAweDAwLCAweDBFLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLworCSAgMHhGRiwgMHhCRSwgMHhFRiwgMHhGRiwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKKwkgIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweEM0LCAweDMwLCAweDAyLCAweDAxLCAweDAxLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLworCSAgMHgzMiwgMHgwMywgMHhBMCwgMHgwOSwgMHhDMCwgMHgzMiwgMHgzMiwgMHgzMiwKKwkgIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCisJICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAorCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgzMiwgMHgzMiwgMHgzMiwKKwkgIDB4MDQsIDB4MjQsIDB4NjMsIDB4NEYsIDB4NTIsIDB4MEIsIDB4REYsIDB4RUEsCisJICAweDA0LCAweDUwLCAweDE5LCAweDMyLCAweDMyLCAweDAwLCAweDAwLCAweDMyLAorCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MDcsIDB4ODIsIDB4MDcsIDB4MDQsCisJICAweDAwLCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDMwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLworCSAgMHhGRiwgMHgwNywgMHgwMCwgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRiwgMHgzMiwKKwkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RkYsIDB4MzIsIDB4MzIsCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLworCSAgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRCwgMHhFRCwKKwkgIDB4N0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RUYsIDB4RkYsIDB4REYsCisJICB9LAorCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAorCSAgMHhGRiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KKwkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisJICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KKwkgIDB4NUYsIDB4NEYsIDB4NEYsIDB4MDAsIDB4NTMsIDB4MUYsIDB4MEIsIDB4M0UsCisJICAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHhFQSwgMHgwQywgMHhERiwgMHg1MCwgMHg0MCwgMHhERiwgMHgwMCwgMHhFMywKKwkgIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDAzLCAweDIwLAorCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhFNywgMHhGRiwgMHhGRCwKKwkgIDB4NUYsIDB4NEYsIDB4MDAsIDB4NTQsIDB4MDAsIDB4MEIsIDB4REYsIDB4MDAsCisJICAweEVBLCAweDBDLCAweDJFLCAweDAwLCAweDRGLCAweERGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLworCSAgMHg1NiwgMHhERCwgMHg1RSwgMHhFQSwgMHg4NywgMHg0NCwgMHg4RiwgMHg1NSwKKwkgIDB4MEEsIDB4OEYsIDB4NTUsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCisJICAweDExLCAweDEwLCAweDBCLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDAwLAorCSAgfSwKKwkgfSwKKwl7CisJIC8qICBtb2RlIzA6IDY0MCB4IDQ4MCAgMzJCcHAgIDYwSHogKi8KKwkgNjQwLCA0ODAsIDMyLCA2MCwKKwkgLyogIEluaXRfTUlTQyAqLworCSAweEUzLAorCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLworCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMCwgMHgwRSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KKwkgIDB4RkYsIDB4QkUsIDB4RUYsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCisJICAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KKwkgIDB4MzIsIDB4MDMsIDB4QTAsIDB4MDksIDB4QzAsIDB4MzIsIDB4MzIsIDB4MzIsCisJICAweDMyLCAweDMyLCAweDMyLCAweDMyLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAorCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKKwkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MzIsIDB4MzIsIDB4MzIsCisJICAweDA0LCAweDI0LCAweDYzLCAweDRGLCAweDUyLCAweDBCLCAweERGLCAweEVBLAorCSAgMHgwNCwgMHg1MCwgMHgxOSwgMHgzMiwgMHgzMiwgMHgwMCwgMHgwMCwgMHgzMiwKKwkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDA3LCAweDgyLCAweDA3LCAweDA0LAorCSAgMHgwMCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgzMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KKwkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MzIsCisJICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEZGLCAweDMyLCAweDMyLAorCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KKwkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCisJICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEZGLCAweERGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKKwkgIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCisJICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKwkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCisJICAweDVGLCAweDRGLCAweDRGLCAweDAwLCAweDUzLCAweDFGLCAweDBCLCAweDNFLAorCSAgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4RUEsIDB4MEMsIDB4REYsIDB4NTAsIDB4NDAsIDB4REYsIDB4MDAsIDB4RTMsCisJICAweEZGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NSwgMHgwMywgMHgyMCwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4RkYsIDB4RkQsCisJICAweDVGLCAweDRGLCAweDAwLCAweDU0LCAweDAwLCAweDBCLCAweERGLCAweDAwLAorCSAgMHhFQSwgMHgwQywgMHgyRSwgMHgwMCwgMHg0RiwgMHhERiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KKwkgIDB4NTYsIDB4REQsIDB4NUUsIDB4RUEsIDB4ODcsIDB4NDQsIDB4OEYsIDB4NTUsCisJICAweDBBLCAweDhGLCAweDU1LCAweDBBLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAorCSAgMHgxMSwgMHgxMCwgMHgwQiwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwMCwKKwkgIH0sCisJIH0sCisKKwl7CQkJLyogIG1vZGUjMjogODAwIHggNjAwICAxNkJwcCAgNjBIeiAqLworCSA4MDAsIDYwMCwgMTYsIDYwLAorCSAvKiAgSW5pdF9NSVNDICovCisJIDB4MkIsCisJIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCisJICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLworCSAgMHhGRiwgMHhCRSwgMHhFRSwgMHhGRiwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKKwkgIDB4OTksIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweEM0LCAweDMwLCAweDAyLCAweDAxLCAweDAxLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLworCSAgMHgzNCwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgyNCwgMHgyNCwgMHgyNCwKKwkgIDB4MjQsIDB4MjQsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCisJICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDM4LCAweDAwLCAweEZDLAorCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgyNCwKKwkgIDB4MDQsIDB4NDgsIDB4ODMsIDB4NjMsIDB4NjgsIDB4NzIsIDB4NTcsIDB4NTgsCisJICAweDA0LCAweDU1LCAweDU5LCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDI0LAorCSAgMHgwMSwgMHg4MCwgMHg3QSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MUMsIDB4ODUsIDB4MzUsIDB4MTMsCisJICAweDAyLCAweDQ1LCAweDMwLCAweDM1LCAweDQwLCAweDIwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg2RiwgMHg3RiwgMHg3RiwgMHhGRiwgMHgyNCwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MjQsIDB4MjQsCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLworCSAgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRCwgMHhFRCwgMHhFRCwKKwkgIDB4N0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RUYsIDB4QkYsIDB4REYsCisJICB9LAorCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAorCSAgMHhGRiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KKwkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisJICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KKwkgIDB4N0YsIDB4NjMsIDB4NjMsIDB4MDAsIDB4NjgsIDB4MTgsIDB4NzIsIDB4RjAsCisJICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHg1OCwgMHgwQywgMHg1NywgMHg2NCwgMHg0MCwgMHg1NywgMHgwMCwgMHhFMywKKwkgIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMzLCAweDAzLCAweDIwLAorCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhFNywgMHhCRiwgMHhGRCwKKwkgIDB4N0YsIDB4NjMsIDB4MDAsIDB4NjksIDB4MTgsIDB4NzIsIDB4NTcsIDB4MDAsCisJICAweDU4LCAweDBDLCAweEUwLCAweDIwLCAweDYzLCAweDU3LAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLworCSAgMHg1NiwgMHg0QiwgMHg1RSwgMHg1NSwgMHg4NiwgMHg5RCwgMHg4RSwgMHhBQSwKKwkgIDB4REIsIDB4MkEsIDB4REYsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCisJICAweDIwLCAweDFGLCAweDFBLCAweDE5LCAweDBGLCAweDBGLCAweDBGLCAweDAwLAorCSAgfSwKKwkgfSwKKwl7CQkJLyogIG1vZGUjMzogODAwIHggNjAwICAyNEJwcCAgNjBIeiAqLworCSA4MDAsIDYwMCwgMjQsIDYwLAorCSAweDJCLAorCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLworCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KKwkgIDB4RkYsIDB4QkUsIDB4RUUsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCisJICAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KKwkgIDB4MzYsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4MzYsIDB4MzYsIDB4MzYsCisJICAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDAwLCAweDAwLCAweDAzLCAweEZGLAorCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKKwkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MzYsIDB4MzYsIDB4MzYsCisJICAweDA0LCAweDQ4LCAweDgzLCAweDYzLCAweDY4LCAweDcyLCAweDU3LCAweDU4LAorCSAgMHgwNCwgMHg1NSwgMHg1OSwgMHgzNiwgMHgzNiwgMHgwMCwgMHgwMCwgMHgzNiwKKwkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDFDLCAweDg1LCAweDM1LCAweDEzLAorCSAgMHgwMiwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KKwkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MzYsCisJICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEZGLCAweDM2LCAweDM2LAorCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KKwkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCisJICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEJGLCAweERGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKKwkgIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCisJICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKwkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCisJICAweDdGLCAweDYzLCAweDYzLCAweDAwLCAweDY4LCAweDE4LCAweDcyLCAweEYwLAorCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4NTgsIDB4MEMsIDB4NTcsIDB4NjQsIDB4NDAsIDB4NTcsIDB4MDAsIDB4RTMsCisJICAweEZGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMywgMHgwMywgMHgyMCwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4QkYsIDB4RkQsCisJICAweDdGLCAweDYzLCAweDAwLCAweDY5LCAweDE4LCAweDcyLCAweDU3LCAweDAwLAorCSAgMHg1OCwgMHgwQywgMHhFMCwgMHgyMCwgMHg2MywgMHg1NywKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KKwkgIDB4NTYsIDB4NEIsIDB4NUUsIDB4NTUsIDB4ODYsIDB4OUQsIDB4OEUsIDB4QUEsCisJICAweERCLCAweDJBLCAweERGLCAweDMzLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAorCSAgMHgyMCwgMHgxRiwgMHgxQSwgMHgxOSwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwMCwKKwkgIH0sCisJIH0sCisJewkJCS8qICBtb2RlIzc6IDgwMCB4IDYwMCAgMzJCcHAgIDYwSHogKi8KKwkgODAwLCA2MDAsIDMyLCA2MCwKKwkgLyogIEluaXRfTUlTQyAqLworCSAweDJCLAorCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLworCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KKwkgIDB4RkYsIDB4QkUsIDB4RUUsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCisJICAweDk5LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHhDNCwgMHgzMCwgMHgwMiwgMHgwMSwgMHgwMSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KKwkgIDB4MzQsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4MjQsIDB4MjQsIDB4MjQsCisJICAweDI0LCAweDI0LCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDAzLCAweEZGLAorCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgzOCwgMHgwMCwgMHhGQywKKwkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MjQsCisJICAweDA0LCAweDQ4LCAweDgzLCAweDYzLCAweDY4LCAweDcyLCAweDU3LCAweDU4LAorCSAgMHgwNCwgMHg1NSwgMHg1OSwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgyNCwKKwkgIDB4MDEsIDB4ODAsIDB4N0EsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDFDLCAweDg1LCAweDM1LCAweDEzLAorCSAgMHgwMiwgMHg0NSwgMHgzMCwgMHgzNSwgMHg0MCwgMHgyMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NkYsIDB4N0YsIDB4N0YsIDB4RkYsIDB4MjQsCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDI0LCAweDI0LAorCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KKwkgIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUQsIDB4RUQsIDB4RUQsCisJICAweDdCLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEVGLCAweEJGLCAweERGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKKwkgIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCisJICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKwkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCisJICAweDdGLCAweDYzLCAweDYzLCAweDAwLCAweDY4LCAweDE4LCAweDcyLCAweEYwLAorCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4NTgsIDB4MEMsIDB4NTcsIDB4NjQsIDB4NDAsIDB4NTcsIDB4MDAsIDB4RTMsCisJICAweEZGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMywgMHgwMywgMHgyMCwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RTcsIDB4QkYsIDB4RkQsCisJICAweDdGLCAweDYzLCAweDAwLCAweDY5LCAweDE4LCAweDcyLCAweDU3LCAweDAwLAorCSAgMHg1OCwgMHgwQywgMHhFMCwgMHgyMCwgMHg2MywgMHg1NywKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KKwkgIDB4NTYsIDB4NEIsIDB4NUUsIDB4NTUsIDB4ODYsIDB4OUQsIDB4OEUsIDB4QUEsCisJICAweERCLCAweDJBLCAweERGLCAweDMzLCAweDAwLCAweDAwLCAweDE4LCAweDAwLAorCSAgMHgyMCwgMHgxRiwgMHgxQSwgMHgxOSwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwMCwKKwkgIH0sCisJIH0sCisJLyogV2UgdXNlIDEwMjR4NzY4IHRhYmxlIHRvIGxpZ2h0IDEwMjR4NjAwIHBhbmVsIGZvciBsZW1vdGUgKi8KKwl7CQkJLyogIG1vZGUjNDogMTAyNCB4IDYwMCAgMTZCcHAgIDYwSHogICovCisJIDEwMjQsIDYwMCwgMTYsIDYwLAorCSAvKiAgSW5pdF9NSVNDICovCisJIDB4RUIsCisJIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCisJICAweDAzLCAweDAxLCAweDBGLCAweDAwLCAweDBFLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLworCSAgMHhDOCwgMHg0MCwgMHgxNCwgMHg2MCwgMHgwMCwgMHgwQSwgMHgxNywgMHgyMCwKKwkgIDB4NTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweEM0LCAweDMwLCAweDAyLCAweDAwLCAweDAxLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLworCSAgMHgyMiwgMHgwMywgMHgyNCwgMHgwOSwgMHhDMCwgMHgyMiwgMHgyMiwgMHgyMiwKKwkgIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCisJICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAorCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgyMiwKKwkgIDB4MDYsIDB4NjgsIDB4QTcsIDB4N0YsIDB4ODMsIDB4MjQsIDB4RkYsIDB4MDMsCisJICAweDAwLCAweDYwLCAweDU5LCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDIyLAorCSAgMHgwMSwgMHg4MCwgMHg3QSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4NTAsIDB4MDMsIDB4MTYsIDB4MDIsIDB4MEQsIDB4ODIsIDB4MDksIDB4MDIsCisJICAweDA0LCAweDQ1LCAweDNGLCAweDMwLCAweDQwLCAweDIwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLworCSAgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzQSwKKwkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4M0EsIDB4M0EsCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLworCSAgMHgwMCwgMHhGQiwgMHg5RiwgMHgwMSwgMHgwMCwgMHhFRCwgMHhFRCwgMHhFRCwKKwkgIDB4N0IsIDB4RkIsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RUYsIDB4QkYsIDB4REYsCisJICB9LAorCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAorCSAgMHhGRiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KKwkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisJICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KKwkgIDB4QTMsIDB4N0YsIDB4N0YsIDB4MDAsIDB4ODUsIDB4MTYsIDB4MjQsIDB4RjUsCisJICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHgwMywgMHgwOSwgMHhGRiwgMHg4MCwgMHg0MCwgMHhGRiwgMHgwMCwgMHhFMywKKwkgIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDIwLAorCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwKKwkgIDB4QTMsIDB4N0YsIDB4MDAsIDB4ODIsIDB4MGIsIDB4NmYsIDB4NTcsIDB4MDAsCisJICAweDVjLCAweDBmLCAweEUwLCAweGUwLCAweDdGLCAweDU3LAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLworCSAgMHg1NSwgMHhEOSwgMHg1RCwgMHhFMSwgMHg4NiwgMHgxQiwgMHg4RSwgMHgyNiwKKwkgIDB4REEsIDB4OEQsIDB4REUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCisJICAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDE1LCAweDAzLAorCSAgfSwKKwkgfSwKKwl7CQkJLyogIG1vZGUjNTogMTAyNCB4IDc2OCAgMjRCcHAgIDYwSHogKi8KKwkgMTAyNCwgNzY4LCAyNCwgNjAsCisJIC8qICBJbml0X01JU0MgKi8KKwkgMHhFQiwKKwkgewkJCS8qICBJbml0X1NSMF9TUjQgKi8KKwkgIDB4MDMsIDB4MDEsIDB4MEYsIDB4MDMsIDB4MEUsCisJICB9LAorCSB7CQkJLyogIEluaXRfU1IxMF9TUjI0ICovCisJICAweEYzLCAweEI2LCAweEMwLCAweERELCAweDAwLCAweDBFLCAweDE3LCAweDJDLAorCSAgMHg5OSwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4QzQsIDB4MzAsIDB4MDIsIDB4MDEsIDB4MDEsCisJICB9LAorCSB7CQkJLyogIEluaXRfU1IzMF9TUjc1ICovCisJICAweDM4LCAweDAzLCAweDIwLCAweDA5LCAweEMwLCAweDNBLCAweDNBLCAweDNBLAorCSAgMHgzQSwgMHgzQSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgwMywgMHhGRiwKKwkgIDB4MDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MTgsIDB4MDAsIDB4RkMsCisJICAweDIwLCAweDBDLCAweDQ0LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDNBLAorCSAgMHgwNiwgMHg2OCwgMHhBNywgMHg3RiwgMHg4MywgMHgyNCwgMHhGRiwgMHgwMywKKwkgIDB4MDAsIDB4NjAsIDB4NTksIDB4M0EsIDB4M0EsIDB4MDAsIDB4MDAsIDB4M0EsCisJICAweDAxLCAweDgwLCAweDdFLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHg1MCwgMHgwMywgMHg3NCwgMHgxNCwgMHgzQiwgMHgwRCwgMHgwOSwgMHgwMiwKKwkgIDB4MDQsIDB4NDUsIDB4MzAsIDB4MzAsIDB4NDAsIDB4MjAsCisJICB9LAorCSB7CQkJLyogIEluaXRfU1I4MF9TUjkzICovCisJICAweEZGLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDNBLAorCSAgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzQSwgMHgzQSwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICB9LAorCSB7CQkJLyogIEluaXRfU1JBMF9TUkFGICovCisJICAweDAwLCAweEZCLCAweDlGLCAweDAxLCAweDAwLCAweEVELCAweEVELCAweEVELAorCSAgMHg3QiwgMHhGQiwgMHhGRiwgMHhGRiwgMHg5NywgMHhFRiwgMHhCRiwgMHhERiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9HUjAwX0dSMDggKi8KKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MEYsCisJICAweEZGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0FSMDBfQVIxNCAqLworCSAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisJICAweDQxLCAweDAwLCAweDBGLCAweDAwLCAweDAwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSMDBfQ1IxOCAqLworCSAgMHhBMywgMHg3RiwgMHg3RiwgMHgwMCwgMHg4NSwgMHgxNiwgMHgyNCwgMHhGNSwKKwkgIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweDAzLCAweDA5LCAweEZGLCAweDgwLCAweDQwLCAweEZGLCAweDAwLCAweEUzLAorCSAgMHhGRiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjMwX0NSNEQgKi8KKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MjAsCisJICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweEZGLCAweEJGLCAweEZGLAorCSAgMHhBMywgMHg3RiwgMHgwMCwgMHg4NiwgMHgxNSwgMHgyNCwgMHhGRiwgMHgwMCwKKwkgIDB4MDEsIDB4MDcsIDB4RTUsIDB4MjAsIDB4N0YsIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1I5MF9DUkE3ICovCisJICAweDU1LCAweEQ5LCAweDVELCAweEUxLCAweDg2LCAweDFCLCAweDhFLCAweDI2LAorCSAgMHhEQSwgMHg4RCwgMHhERSwgMHg5NCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwKKwkgIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MTUsIDB4MDMsCisJICB9LAorCSB9LAorCXsJCQkvKiAgbW9kZSM0OiAxMDI0IHggNzY4ICAzMkJwcCAgNjBIeiAqLworCSAxMDI0LCA3NjgsIDMyLCA2MCwKKwkgLyogIEluaXRfTUlTQyAqLworCSAweEVCLAorCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLworCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KKwkgIDB4RjMsIDB4QjYsIDB4QzAsIDB4REQsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCisJICAweDk5LCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHhDNCwgMHgzMiwgMHgwMiwgMHgwMSwgMHgwMSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KKwkgIDB4MzgsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4M0EsIDB4M0EsIDB4M0EsCisJICAweDNBLCAweDNBLCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAorCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKKwkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0EsCisJICAweDA2LCAweDY4LCAweEE3LCAweDdGLCAweDgzLCAweDI0LCAweEZGLCAweDAzLAorCSAgMHgwMCwgMHg2MCwgMHg1OSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgzQSwKKwkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDNCLCAweDBELCAweDA5LCAweDAyLAorCSAgMHgwNCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KKwkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0EsCisJICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDNBLCAweDNBLAorCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KKwkgIDB4MDAsIDB4RkIsIDB4OUYsIDB4MDEsIDB4MDAsIDB4RUQsIDB4RUQsIDB4RUQsCisJICAweDdCLCAweEZCLCAweEZGLCAweEZGLCAweDk3LCAweEVGLCAweEJGLCAweERGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKKwkgIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCisJICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKwkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCisJICAweEEzLCAweDdGLCAweDdGLCAweDAwLCAweDg1LCAweDE2LCAweDI0LCAweEY1LAorCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4MDMsIDB4MDksIDB4RkYsIDB4ODAsIDB4NDAsIDB4RkYsIDB4MDAsIDB4RTMsCisJICAweEZGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMiwgMHgyMCwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsCisJICAweEEzLCAweDdGLCAweDAwLCAweDg2LCAweDE1LCAweDI0LCAweEZGLCAweDAwLAorCSAgMHgwMSwgMHgwNywgMHhFNSwgMHgyMCwgMHg3RiwgMHhGRiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KKwkgIDB4NTUsIDB4RDksIDB4NUQsIDB4RTEsIDB4ODYsIDB4MUIsIDB4OEUsIDB4MjYsCisJICAweERBLCAweDhELCAweERFLCAweDk0LCAweDAwLCAweDAwLCAweDE4LCAweDAwLAorCSAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgxNSwgMHgwMywKKwkgIH0sCisJIH0sCisJewkJCS8qICBtb2RlIzY6IDMyMCB4IDI0MCAgMTZCcHAgIDYwSHogKi8KKwkgMzIwLCAyNDAsIDE2LCA2MCwKKwkgLyogIEluaXRfTUlTQyAqLworCSAweEVCLAorCSB7CQkJLyogIEluaXRfU1IwX1NSNCAqLworCSAgMHgwMywgMHgwMSwgMHgwRiwgMHgwMywgMHgwRSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjEwX1NSMjQgKi8KKwkgIDB4RjMsIDB4QjYsIDB4QzAsIDB4REQsIDB4MDAsIDB4MEUsIDB4MTcsIDB4MkMsCisJICAweDk5LCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHhDNCwgMHgzMiwgMHgwMiwgMHgwMSwgMHgwMSwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjMwX1NSNzUgKi8KKwkgIDB4MzgsIDB4MDMsIDB4MjAsIDB4MDksIDB4QzAsIDB4M0EsIDB4M0EsIDB4M0EsCisJICAweDNBLCAweDNBLCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDAzLCAweEZGLAorCSAgMHgwMCwgMHhGQywgMHgwMCwgMHgwMCwgMHgyMCwgMHgxOCwgMHgwMCwgMHhGQywKKwkgIDB4MjAsIDB4MEMsIDB4NDQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0EsCisJICAweDA2LCAweDY4LCAweEE3LCAweDdGLCAweDgzLCAweDI0LCAweEZGLCAweDAzLAorCSAgMHgwMCwgMHg2MCwgMHg1OSwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwMCwgMHgzQSwKKwkgIDB4MDEsIDB4ODAsIDB4N0UsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweDUwLCAweDAzLCAweDc0LCAweDE0LCAweDA4LCAweDQzLCAweDA4LCAweDQzLAorCSAgMHgwNCwgMHg0NSwgMHgzMCwgMHgzMCwgMHg0MCwgMHgyMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUjgwX1NSOTMgKi8KKwkgIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0EsCisJICAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDNBLCAweDNBLAorCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9TUkEwX1NSQUYgKi8KKwkgIDB4MDAsIDB4RkIsIDB4OUYsIDB4MDEsIDB4MDAsIDB4RUQsIDB4RUQsIDB4RUQsCisJICAweDdCLCAweEZCLCAweEZGLCAweEZGLCAweDk3LCAweEVGLCAweEJGLCAweERGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0dSMDBfR1IwOCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwRiwKKwkgIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQVIwMF9BUjE0ICovCisJICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCSAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKwkgIDB4NDEsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDAsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1IwMF9DUjE4ICovCisJICAweEEzLCAweDdGLCAweDdGLCAweDAwLCAweDg1LCAweDE2LCAweDI0LCAweEY1LAorCSAgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4MDMsIDB4MDksIDB4RkYsIDB4ODAsIDB4NDAsIDB4RkYsIDB4MDAsIDB4RTMsCisJICAweEZGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSMzBfQ1I0RCAqLworCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMiwgMHgyMCwKKwkgIDB4MDAsIDB4MDAsIDB4MzAsIDB4NDAsIDB4MDAsIDB4RkYsIDB4QkYsIDB4RkYsCisJICAweDJFLCAweDI3LCAweDAwLCAweDJiLCAweDBjLCAweDBGLCAweEVGLCAweDAwLAorCSAgMHhGZSwgMHgwZiwgMHgwMSwgMHhDMCwgMHgyNywgMHhFRiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjkwX0NSQTcgKi8KKwkgIDB4NTUsIDB4RDksIDB4NUQsIDB4RTEsIDB4ODYsIDB4MUIsIDB4OEUsIDB4MjYsCisJICAweERBLCAweDhELCAweERFLCAweDk0LCAweDAwLCAweDAwLCAweDE4LCAweDAwLAorCSAgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgxNSwgMHgwMywKKwkgIH0sCisJIH0sCisKKwl7CQkJLyogIG1vZGUjODogMzIwIHggMjQwICAzMkJwcCAgNjBIeiAqLworCSAzMjAsIDI0MCwgMzIsIDYwLAorCSAvKiAgSW5pdF9NSVNDICovCisJIDB4RUIsCisJIHsJCQkvKiAgSW5pdF9TUjBfU1I0ICovCisJICAweDAzLCAweDAxLCAweDBGLCAweDAzLCAweDBFLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSMTBfU1IyNCAqLworCSAgMHhGMywgMHhCNiwgMHhDMCwgMHhERCwgMHgwMCwgMHgwRSwgMHgxNywgMHgyQywKKwkgIDB4OTksIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweEM0LCAweDMyLCAweDAyLCAweDAxLCAweDAxLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSMzBfU1I3NSAqLworCSAgMHgzOCwgMHgwMywgMHgyMCwgMHgwOSwgMHhDMCwgMHgzQSwgMHgzQSwgMHgzQSwKKwkgIDB4M0EsIDB4M0EsIDB4M0EsIDB4M0EsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RkYsCisJICAweDAwLCAweEZDLCAweDAwLCAweDAwLCAweDIwLCAweDE4LCAweDAwLCAweEZDLAorCSAgMHgyMCwgMHgwQywgMHg0NCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzQSwKKwkgIDB4MDYsIDB4NjgsIDB4QTcsIDB4N0YsIDB4ODMsIDB4MjQsIDB4RkYsIDB4MDMsCisJICAweDAwLCAweDYwLCAweDU5LCAweDNBLCAweDNBLCAweDAwLCAweDAwLCAweDNBLAorCSAgMHgwMSwgMHg4MCwgMHg3RSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4NTAsIDB4MDMsIDB4NzQsIDB4MTQsIDB4MDgsIDB4NDMsIDB4MDgsIDB4NDMsCisJICAweDA0LCAweDQ1LCAweDMwLCAweDMwLCAweDQwLCAweDIwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSODBfU1I5MyAqLworCSAgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzQSwKKwkgIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4M0EsIDB4M0EsCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgfSwKKwkgewkJCS8qICBJbml0X1NSQTBfU1JBRiAqLworCSAgMHgwMCwgMHhGQiwgMHg5RiwgMHgwMSwgMHgwMCwgMHhFRCwgMHhFRCwgMHhFRCwKKwkgIDB4N0IsIDB4RkIsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RUYsIDB4QkYsIDB4REYsCisJICB9LAorCSB7CQkJLyogIEluaXRfR1IwMF9HUjA4ICovCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDA1LCAweDBGLAorCSAgMHhGRiwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9BUjAwX0FSMTQgKi8KKwkgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisJICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorCSAgMHg0MSwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMCwKKwkgIH0sCisJIHsJCQkvKiAgSW5pdF9DUjAwX0NSMTggKi8KKwkgIDB4QTMsIDB4N0YsIDB4N0YsIDB4MDAsIDB4ODUsIDB4MTYsIDB4MjQsIDB4RjUsCisJICAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAgMHgwMywgMHgwOSwgMHhGRiwgMHg4MCwgMHg0MCwgMHhGRiwgMHgwMCwgMHhFMywKKwkgIDB4RkYsCisJICB9LAorCSB7CQkJLyogIEluaXRfQ1IzMF9DUjREICovCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDIwLAorCSAgMHgwMCwgMHgwMCwgMHgzMCwgMHg0MCwgMHgwMCwgMHhGRiwgMHhCRiwgMHhGRiwKKwkgIDB4MkUsIDB4MjcsIDB4MDAsIDB4MmIsIDB4MGMsIDB4MEYsIDB4RUYsIDB4MDAsCisJICAweEZlLCAweDBmLCAweDAxLCAweEMwLCAweDI3LCAweEVGLAorCSAgfSwKKwkgewkJCS8qICBJbml0X0NSOTBfQ1JBNyAqLworCSAgMHg1NSwgMHhEOSwgMHg1RCwgMHhFMSwgMHg4NiwgMHgxQiwgMHg4RSwgMHgyNiwKKwkgIDB4REEsIDB4OEQsIDB4REUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsCisJICAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDE1LCAweDAzLAorCSAgfSwKKwkgfSwKK307CisKKyNkZWZpbmUgbnVtVkdBTW9kZXMJCShzaXplb2YoVkdBTW9kZSkgLyBzaXplb2Yoc3RydWN0IE1vZGVJbml0KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvS2NvbmZpZwppbmRleCA4MjViYmM0Li4wNjFlNzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFZUNjY1NQogICAgdHJpc3RhdGUgIlZJQSBUZWNobm9sb2dpZXMgVlQ2NjU1IHN1cHBvcnQiCi0gICBkZXBlbmRzIG9uIFBDSQorICAgZGVwZW5kcyBvbiBQQ0kgJiYgV0xBTgogICAgc2VsZWN0IFdJUkVMRVNTX0VYVAogICAgc2VsZWN0IFdFWFRfUFJJVgogICAgLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9LY29uZmlnCmluZGV4IDg3YmNkMjYuLjEwNTViNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgVlQ2NjU2CiAJdHJpc3RhdGUgIlZJQSBUZWNobm9sb2dpZXMgVlQ2NjU2IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0IKKwlkZXBlbmRzIG9uIFVTQiAmJiBXTEFOCiAJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBXRVhUX1BSSVYKIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYwppbmRleCA3ZDc2YTdmLi5hYWE3MGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMmZ3LmMKQEAgLTQzOSw3ICs0MzksNyBAQAogCQl9CiAJfQogCSpuZmNodW5rcyA9IDA7Ci0JbWVtc2V0KGZjaHVuaywgMCwgc2l6ZW9mKGZjaHVuaykpOworCW1lbXNldChmY2h1bmssIDAsIHNpemVvZigqZmNodW5rKSk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQppbmRleCA0NzNhYTFhLi5iZTNjOWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQpAQCAtNDQsNSArNDQsMyBAQAogCiBvYmotJChDT05GSUdfVVNCX0FUTSkJCSs9IGF0bS8KIG9iai0kKENPTkZJR19VU0JfU1BFRURUT1VDSCkJKz0gYXRtLwotCi1vYmotJChDT05GSUdfVVNCX1VMUEkpCQkrPSBvdGcvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCA2ZGFjM2I4Li4wNDk1ZmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTE1OTcsNyArMTU5Nyw5IEBACiB9CiAKIC8qKgotICogQ2hlY2sgd2hldGhlciBhIG5ldyBiYW5kd2lkdGggc2V0dGluZyBleGNlZWRzIHRoZSBidXMgYmFuZHdpZHRoLgorICogdXNiX2hjZF9hbGxvY19iYW5kd2lkdGggLSBjaGVjayB3aGV0aGVyIGEgbmV3IGJhbmR3aWR0aCBzZXR0aW5nIGV4Y2VlZHMKKyAqCQkJCXRoZSBidXMgYmFuZHdpZHRoCisgKiBAdWRldjogdGFyZ2V0ICZ1c2JfZGV2aWNlCiAgKiBAbmV3X2NvbmZpZzogbmV3IGNvbmZpZ3VyYXRpb24gdG8gaW5zdGFsbAogICogQGN1cl9hbHQ6IHRoZSBjdXJyZW50IGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZwogICogQG5ld19hbHQ6IGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZyB0aGF0IGlzIGJlaW5nIGluc3RhbGxlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9odWIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKaW5kZXggMDZhZjk3MC4uMGNlYzZjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9odWIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCkBAIC0xNjU4LDEyICsxNjU4LDEyIEBACiAjZW5kaWYKIAogLyoqCi0gKiB1c2JfY29uZmlndXJlX2RldmljZV9vdGcgLSBGSVhNRSAodXNiY29yZS1pbnRlcm5hbCkKKyAqIHVzYl9lbnVtZXJhdGVfZGV2aWNlX290ZyAtIEZJWE1FICh1c2Jjb3JlLWludGVybmFsKQogICogQHVkZXY6IG5ld2x5IGFkZHJlc3NlZCBkZXZpY2UgKGluIEFERFJFU1Mgc3RhdGUpCiAgKgotICogRG8gY29uZmlndXJhdGlvbiBmb3IgT24tVGhlLUdvIGRldmljZXMKKyAqIEZpbmlzaCBlbnVtZXJhdGlvbiBmb3IgT24tVGhlLUdvIGRldmljZXMKICAqLwotc3RhdGljIGludCB1c2JfY29uZmlndXJlX2RldmljZV9vdGcoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgaW50IHVzYl9lbnVtZXJhdGVfZGV2aWNlX290ZyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlpbnQgZXJyID0gMDsKIApAQCAtMTczNCw3ICsxNzM0LDcgQEAKIAogCiAvKioKLSAqIHVzYl9jb25maWd1cmVfZGV2aWNlIC0gRGV0ZWN0IGFuZCBwcm9iZSBkZXZpY2UgaW50ZnMvb3RnICh1c2Jjb3JlLWludGVybmFsKQorICogdXNiX2VudW1lcmF0ZV9kZXZpY2UgLSBSZWFkIGRldmljZSBjb25maWdzL2ludGZzL290ZyAodXNiY29yZS1pbnRlcm5hbCkKICAqIEB1ZGV2OiBuZXdseSBhZGRyZXNzZWQgZGV2aWNlIChpbiBBRERSRVNTIHN0YXRlKQogICoKICAqIFRoaXMgaXMgb25seSBjYWxsZWQgYnkgdXNiX25ld19kZXZpY2UoKSBhbmQgdXNiX2F1dGhvcml6ZV9kZXZpY2UoKQpAQCAtMTc0NSw3ICsxNzQ1LDcgQEAKICAqIHRoZSBzdHJpbmcgZGVzY3JpcHRvcnMsIGFzIHRoZXkgd2lsbCBiZSBlcnJvcmVkIG91dCBieSB0aGUgZGV2aWNlCiAgKiB1bnRpbCBpdCBoYXMgYmVlbiBhdXRob3JpemVkLgogICovCi1zdGF0aWMgaW50IHVzYl9jb25maWd1cmVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIGludCB1c2JfZW51bWVyYXRlX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlpbnQgZXJyOwogCkBAIC0xNzY5LDcgKzE3NjksNyBAQAogCQkJCQkJICAgICAgdWRldi0+ZGVzY3JpcHRvci5pTWFudWZhY3R1cmVyKTsKIAkJdWRldi0+c2VyaWFsID0gdXNiX2NhY2hlX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIpOwogCX0KLQllcnIgPSB1c2JfY29uZmlndXJlX2RldmljZV9vdGcodWRldik7CisJZXJyID0gdXNiX2VudW1lcmF0ZV9kZXZpY2Vfb3RnKHVkZXYpOwogZmFpbDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTc3OSw4ICsxNzc5LDggQEAKICAqIHVzYl9uZXdfZGV2aWNlIC0gcGVyZm9ybSBpbml0aWFsIGRldmljZSBzZXR1cCAodXNiY29yZS1pbnRlcm5hbCkKICAqIEB1ZGV2OiBuZXdseSBhZGRyZXNzZWQgZGV2aWNlIChpbiBBRERSRVNTIHN0YXRlKQogICoKLSAqIFRoaXMgaXMgY2FsbGVkIHdpdGggZGV2aWNlcyB3aGljaCBoYXZlIGJlZW4gZW51bWVyYXRlZCwgYnV0IG5vdCB5ZXQKLSAqIGNvbmZpZ3VyZWQuICBUaGUgZGV2aWNlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlLCBidXQgbm90IGRlc2NyaXB0b3JzCisgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIGRldmljZXMgd2hpY2ggaGF2ZSBiZWVuIGRldGVjdGVkIGJ1dCBub3QgZnVsbHkKKyAqIGVudW1lcmF0ZWQuICBUaGUgZGV2aWNlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlLCBidXQgbm90IGRlc2NyaXB0b3JzCiAgKiBmb3IgYW55IGRldmljZSBjb25maWd1cmF0aW9uLiAgVGhlIGNhbGxlciBtdXN0IGhhdmUgbG9ja2VkIGVpdGhlcgogICogdGhlIHBhcmVudCBodWIgKGlmIHVkZXYgaXMgYSBub3JtYWwgZGV2aWNlKSBvciBlbHNlIHRoZQogICogdXNiX2J1c19saXN0X2xvY2sgKGlmIHVkZXYgaXMgYSByb290IGh1YikuICBUaGUgcGFyZW50J3MgcG9pbnRlciB0bwpAQCAtMTgwMyw4ICsxODAzLDggQEAKIAlpZiAodWRldi0+cGFyZW50KQogCQl1c2JfYXV0b3Jlc3VtZV9kZXZpY2UodWRldi0+cGFyZW50KTsKIAotCXVzYl9kZXRlY3RfcXVpcmtzKHVkZXYpOwkJLyogRGV0ZXJtaW5lIHF1aXJrcyAqLwotCWVyciA9IHVzYl9jb25maWd1cmVfZGV2aWNlKHVkZXYpOwkvKiBkZXRlY3QgJiBwcm9iZSBkZXYvaW50ZnMgKi8KKwl1c2JfZGV0ZWN0X3F1aXJrcyh1ZGV2KTsKKwllcnIgPSB1c2JfZW51bWVyYXRlX2RldmljZSh1ZGV2KTsJLyogUmVhZCBkZXNjcmlwdG9ycyAqLwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGZhaWw7CiAJZGV2X2RiZygmdWRldi0+ZGV2LCAidWRldiAlZCwgYnVzbnVtICVkLCBtaW5vciA9ICVkXG4iLApAQCAtMTg0OSwyMSArMTg0OSwyMyBAQAogICovCiBpbnQgdXNiX2RlYXV0aG9yaXplX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKIHsKLQl1bnNpZ25lZCBjbnQ7CiAJdXNiX2xvY2tfZGV2aWNlKHVzYl9kZXYpOwogCWlmICh1c2JfZGV2LT5hdXRob3JpemVkID09IDApCiAJCWdvdG8gb3V0X3VuYXV0aG9yaXplZDsKKwogCXVzYl9kZXYtPmF1dGhvcml6ZWQgPSAwOwogCXVzYl9zZXRfY29uZmlndXJhdGlvbih1c2JfZGV2LCAtMSk7CisKKwlrZnJlZSh1c2JfZGV2LT5wcm9kdWN0KTsKIAl1c2JfZGV2LT5wcm9kdWN0ID0ga3N0cmR1cCgibi9hICh1bmF1dGhvcml6ZWQpIiwgR0ZQX0tFUk5FTCk7CisJa2ZyZWUodXNiX2Rldi0+bWFudWZhY3R1cmVyKTsKIAl1c2JfZGV2LT5tYW51ZmFjdHVyZXIgPSBrc3RyZHVwKCJuL2EgKHVuYXV0aG9yaXplZCkiLCBHRlBfS0VSTkVMKTsKKwlrZnJlZSh1c2JfZGV2LT5zZXJpYWwpOwogCXVzYl9kZXYtPnNlcmlhbCA9IGtzdHJkdXAoIm4vYSAodW5hdXRob3JpemVkKSIsIEdGUF9LRVJORUwpOwotCWtmcmVlKHVzYl9kZXYtPmNvbmZpZyk7Ci0JdXNiX2Rldi0+Y29uZmlnID0gTlVMTDsKLQlmb3IgKGNudCA9IDA7IGNudCA8IHVzYl9kZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zOyBjbnQrKykKLQkJa2ZyZWUodXNiX2Rldi0+cmF3ZGVzY3JpcHRvcnNbY250XSk7CisKKwl1c2JfZGVzdHJveV9jb25maWd1cmF0aW9uKHVzYl9kZXYpOwogCXVzYl9kZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zID0gMDsKLQlrZnJlZSh1c2JfZGV2LT5yYXdkZXNjcmlwdG9ycyk7CisKIG91dF91bmF1dGhvcml6ZWQ6CiAJdXNiX3VubG9ja19kZXZpY2UodXNiX2Rldik7CiAJcmV0dXJuIDA7CkBAIC0xODczLDE1ICsxODc1LDExIEBACiBpbnQgdXNiX2F1dGhvcml6ZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCiB7CiAJaW50IHJlc3VsdCA9IDAsIGM7CisKIAl1c2JfbG9ja19kZXZpY2UodXNiX2Rldik7CiAJaWYgKHVzYl9kZXYtPmF1dGhvcml6ZWQgPT0gMSkKIAkJZ290byBvdXRfYXV0aG9yaXplZDsKLQlrZnJlZSh1c2JfZGV2LT5wcm9kdWN0KTsKLQl1c2JfZGV2LT5wcm9kdWN0ID0gTlVMTDsKLQlrZnJlZSh1c2JfZGV2LT5tYW51ZmFjdHVyZXIpOwotCXVzYl9kZXYtPm1hbnVmYWN0dXJlciA9IE5VTEw7Ci0Ja2ZyZWUodXNiX2Rldi0+c2VyaWFsKTsKLQl1c2JfZGV2LT5zZXJpYWwgPSBOVUxMOworCiAJcmVzdWx0ID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVzYl9kZXYpOwogCWlmIChyZXN1bHQgPCAwKSB7CiAJCWRldl9lcnIoJnVzYl9kZXYtPmRldiwKQEAgLTE4OTQsMTAgKzE4OTIsMTggQEAKIAkJCSJhdXRob3JpemF0aW9uOiAlZFxuIiwgcmVzdWx0KTsKIAkJZ290byBlcnJvcl9kZXZpY2VfZGVzY3JpcHRvcjsKIAl9CisKKwlrZnJlZSh1c2JfZGV2LT5wcm9kdWN0KTsKKwl1c2JfZGV2LT5wcm9kdWN0ID0gTlVMTDsKKwlrZnJlZSh1c2JfZGV2LT5tYW51ZmFjdHVyZXIpOworCXVzYl9kZXYtPm1hbnVmYWN0dXJlciA9IE5VTEw7CisJa2ZyZWUodXNiX2Rldi0+c2VyaWFsKTsKKwl1c2JfZGV2LT5zZXJpYWwgPSBOVUxMOworCiAJdXNiX2Rldi0+YXV0aG9yaXplZCA9IDE7Ci0JcmVzdWx0ID0gdXNiX2NvbmZpZ3VyZV9kZXZpY2UodXNiX2Rldik7CisJcmVzdWx0ID0gdXNiX2VudW1lcmF0ZV9kZXZpY2UodXNiX2Rldik7CiAJaWYgKHJlc3VsdCA8IDApCi0JCWdvdG8gZXJyb3JfY29uZmlndXJlOworCQlnb3RvIGVycm9yX2VudW1lcmF0ZTsKIAkvKiBDaG9vc2UgYW5kIHNldCB0aGUgY29uZmlndXJhdGlvbi4gIFRoaXMgcmVnaXN0ZXJzIHRoZSBpbnRlcmZhY2VzCiAJICogd2l0aCB0aGUgZHJpdmVyIGNvcmUgYW5kIGxldHMgaW50ZXJmYWNlIGRyaXZlcnMgYmluZCB0byB0aGVtLgogCSAqLwpAQCAtMTkxMiw4ICsxOTE4LDEwIEBACiAJCX0KIAl9CiAJZGV2X2luZm8oJnVzYl9kZXYtPmRldiwgImF1dGhvcml6ZWQgdG8gY29ubmVjdFxuIik7Ci1lcnJvcl9jb25maWd1cmU6CisKK2Vycm9yX2VudW1lcmF0ZToKIGVycm9yX2RldmljZV9kZXNjcmlwdG9yOgorCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodXNiX2Rldik7CiBlcnJvcl9hdXRvcmVzdW1lOgogb3V0X2F1dGhvcml6ZWQ6CiAJdXNiX3VubG9ja19kZXZpY2UodXNiX2Rldik7CS8vIGNvbXBsZW1lbnRzIGxvY2t0cmVlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKaW5kZXggMTU0NzcwMC4uNDg1ZWRmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYwpAQCAtODIsOSArODIsMTMgQEAKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKIHsJCQkJCQkJCQlcCiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CQkJCQlcCisJaW50IHJldHZhbDsJCQkJCQkJXAogCQkJCQkJCQkJXAogCXVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CQkJCQlcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHVkZXYtPm5hbWUpOwkJCVwKKwl1c2JfbG9ja19kZXZpY2UodWRldik7CQkJCQkJXAorCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJXNcbiIsIHVkZXYtPm5hbWUpOwkJCVwKKwl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsJCQkJCVwKKwlyZXR1cm4gcmV0dmFsOwkJCQkJCQlcCiB9CQkJCQkJCQkJXAogc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKaW5kZXggMmZiNDIwNC4uMGRhZmYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCkBAIC02Niw5ICs2Niw5IEBACiAvKioKICAqIHVzYl9maW5kX2FsdF9zZXR0aW5nKCkgLSBHaXZlbiBhIGNvbmZpZ3VyYXRpb24sIGZpbmQgdGhlIGFsdGVybmF0ZSBzZXR0aW5nCiAgKiBmb3IgdGhlIGdpdmVuIGludGVyZmFjZS4KLSAqIEBjb25maWcgLSB0aGUgY29uZmlndXJhdGlvbiB0byBzZWFyY2ggKG5vdCBuZWNlc3NhcmlseSB0aGUgY3VycmVudCBjb25maWcpLgotICogQGlmYWNlX251bSAtIGludGVyZmFjZSBudW1iZXIgdG8gc2VhcmNoIGluCi0gKiBAYWx0X251bSAtIGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZyBudW1iZXIgdG8gc2VhcmNoIGZvci4KKyAqIEBjb25maWc6IHRoZSBjb25maWd1cmF0aW9uIHRvIHNlYXJjaCAobm90IG5lY2Vzc2FyaWx5IHRoZSBjdXJyZW50IGNvbmZpZykuCisgKiBAaWZhY2VfbnVtOiBpbnRlcmZhY2UgbnVtYmVyIHRvIHNlYXJjaCBpbgorICogQGFsdF9udW06IGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZyBudW1iZXIgdG8gc2VhcmNoIGZvci4KICAqCiAgKiBTZWFyY2ggdGhlIGNvbmZpZ3VyYXRpb24ncyBpbnRlcmZhY2UgY2FjaGUgZm9yIHRoZSBnaXZlbiBhbHQgc2V0dGluZy4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZWFybHkvZWhjaS1kYmdwLmMgYi9kcml2ZXJzL3VzYi9lYXJseS9laGNpLWRiZ3AuYwppbmRleCAxMjA2YTI2Li4yOTU4YTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9lYXJseS9laGNpLWRiZ3AuYworKysgYi9kcml2ZXJzL3VzYi9lYXJseS9laGNpLWRiZ3AuYwpAQCAtNjEzLDcgKzYxMyw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkYmdwX2V4dGVybmFsX3N0YXJ0dXApOwogCi1zdGF0aWMgaW50IF9faW5pdCBlaGNpX3Jlc2V0X3BvcnQoaW50IHBvcnQpCitzdGF0aWMgaW50IGVoY2lfcmVzZXRfcG9ydChpbnQgcG9ydCkKIHsKIAl1MzIgcG9ydHNjOwogCXUzMiBkZWxheV90aW1lLCBkZWxheTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdWRpby5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F1ZGlvLmMKaW5kZXggNThmMjIwMy4uYTYyYWY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F1ZGlvLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F1ZGlvLmMKQEAgLTE1OCw2ICsxNTgsNyBAQAogCiBzdGF0aWMgaW50IF9fZXhpdCBhdWRpb191bmJpbmQoc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2KQogeworCWdhdWRpb19jbGVhbnVwKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2F1ZGlvLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9hdWRpby5jCmluZGV4IGM0M2M4OWYuLmRmNzdmNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2F1ZGlvLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYXVkaW8uYwpAQCAtNTYsMTMgKzU2LDE2IEBACiBERUNMQVJFX1VBQ19BQ19IRUFERVJfREVTQ1JJUFRPUigyKTsKIAogI2RlZmluZSBVQUNfRFRfQUNfSEVBREVSX0xFTkdUSAlVQUNfRFRfQUNfSEVBREVSX1NJWkUoRl9BVURJT19OVU1fSU5URVJGQUNFUykKKy8qIDEgaW5wdXQgdGVybWluYWwsIDEgb3V0cHV0IHRlcm1pbmFsIGFuZCAxIGZlYXR1cmUgdW5pdCAqLworI2RlZmluZSBVQUNfRFRfVE9UQUxfTEVOR1RIIChVQUNfRFRfQUNfSEVBREVSX0xFTkdUSCArIFVBQ19EVF9JTlBVVF9URVJNSU5BTF9TSVpFIFwKKwkrIFVBQ19EVF9PVVRQVVRfVEVSTUlOQUxfU0laRSArIFVBQ19EVF9GRUFUVVJFX1VOSVRfU0laRSgwKSkKIC8qIEIuMy4yICBDbGFzcy1TcGVjaWZpYyBBQyBJbnRlcmZhY2UgRGVzY3JpcHRvciAqLwogc3RhdGljIHN0cnVjdCB1YWNfYWNfaGVhZGVyX2Rlc2NyaXB0b3JfMiBhY19oZWFkZXJfZGVzYyA9IHsKIAkuYkxlbmd0aCA9CQlVQUNfRFRfQUNfSEVBREVSX0xFTkdUSCwKIAkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0NTX0lOVEVSRkFDRSwKIAkuYkRlc2NyaXB0b3JTdWJ0eXBlID0JVUFDX0hFQURFUiwKIAkuYmNkQURDID0JCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMTAwKSwKLQkud1RvdGFsTGVuZ3RoID0JCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoVUFDX0RUX0FDX0hFQURFUl9MRU5HVEgpLAorCS53VG90YWxMZW5ndGggPQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihVQUNfRFRfVE9UQUxfTEVOR1RIKSwKIAkuYkluQ29sbGVjdGlvbiA9CUZfQVVESU9fTlVNX0lOVEVSRkFDRVMsCiAJLmJhSW50ZXJmYWNlTnIgPSB7CiAJCVswXSA9CQlGX0FVRElPX0FDX0lOVEVSRkFDRSwKQEAgLTI1MiwxMiArMjU1LDEyIEBACiAKIAljb3B5X2J1ZiA9IGt6YWxsb2Moc2l6ZW9mICpjb3B5X2J1ZiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFjb3B5X2J1ZikKLQkJcmV0dXJuIChzdHJ1Y3QgZl9hdWRpb19idWYgKiktRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWNvcHlfYnVmLT5idWYgPSBremFsbG9jKGJ1Zl9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWNvcHlfYnVmLT5idWYpIHsKIAkJa2ZyZWUoY29weV9idWYpOwotCQlyZXR1cm4gKHN0cnVjdCBmX2F1ZGlvX2J1ZiAqKS1FTk9NRU07CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAogCXJldHVybiBjb3B5X2J1ZjsKQEAgLTMzMiw3ICszMzUsNyBAQAogCQlsaXN0X2FkZF90YWlsKCZjb3B5X2J1Zi0+bGlzdCwgJmF1ZGlvLT5wbGF5X3F1ZXVlKTsKIAkJc2NoZWR1bGVfd29yaygmYXVkaW8tPnBsYXliYWNrX3dvcmspOwogCQljb3B5X2J1ZiA9IGZfYXVkaW9fYnVmZmVyX2FsbG9jKGF1ZGlvX2J1Zl9zaXplKTsKLQkJaWYgKGNvcHlfYnVmIDwgMCkKKwkJaWYgKElTX0VSUihjb3B5X2J1ZikpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTU3Niw2ICs1NzksOCBAQAogCQkJdXNiX2VwX2VuYWJsZShvdXRfZXAsIGF1ZGlvLT5vdXRfZGVzYyk7CiAJCQlvdXRfZXAtPmRyaXZlcl9kYXRhID0gYXVkaW87CiAJCQlhdWRpby0+Y29weV9idWYgPSBmX2F1ZGlvX2J1ZmZlcl9hbGxvYyhhdWRpb19idWZfc2l6ZSk7CisJCQlpZiAoSVNfRVJSKGF1ZGlvLT5jb3B5X2J1ZikpCisJCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJCS8qCiAJCQkgKiBhbGxvY2F0ZSBhIGJ1bmNoIG9mIHJlYWQgYnVmZmVycwpAQCAtNzg3LDcgKzc5Miw3IEBACiAJcmV0dXJuIHN0YXR1czsKIAogYWRkX2ZhaWw6Ci0JZ2F1ZGlvX2NsZWFudXAoJmF1ZGlvLT5jYXJkKTsKKwlnYXVkaW9fY2xlYW51cCgpOwogc2V0dXBfZmFpbDoKIAlrZnJlZShhdWRpbyk7CiAJcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2F1ZGlvLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9hdWRpby5jCmluZGV4IDgyNTI1OTVkLi4zNWUwOTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9hdWRpby5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2F1ZGlvLmMKQEAgLTI4OCw2ICsyODgsNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGdhdWRpbyAqdGhlX2NhcmQ7CiAvKioKICAqIGdhdWRpb19zZXR1cCAtIHNldHVwIEFMU0EgaW50ZXJmYWNlIGFuZCBwcmVwYXJpbmcgZm9yIFVTQiB0cmFuc2ZlcgogICoKQEAgLTMwMyw2ICszMDQsOSBAQAogCWlmIChyZXQpCiAJCUVSUk9SKGNhcmQsICJ3ZSBuZWVkIGF0IGxlYXN0IG9uZSBjb250cm9sIGRldmljZVxuIik7CiAKKwlpZiAoIXRoZV9jYXJkKQorCQl0aGVfY2FyZCA9IGNhcmQ7CisKIAlyZXR1cm4gcmV0OwogCiB9CkBAIC0zMTIsOSArMzE2LDExIEBACiAgKgogICogVGhpcyBpcyBjYWxsZWQgdG8gZnJlZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBAZ2F1ZGlvX3NldHVwKCkuCiAgKi8KLXZvaWQgZ2F1ZGlvX2NsZWFudXAoc3RydWN0IGdhdWRpbyAqY2FyZCkKK3ZvaWQgZ2F1ZGlvX2NsZWFudXAodm9pZCkKIHsKLQlpZiAoY2FyZCkKLQkJZ2F1ZGlvX2Nsb3NlX3NuZF9kZXYoY2FyZCk7CisJaWYgKHRoZV9jYXJkKSB7CisJCWdhdWRpb19jbG9zZV9zbmRfZGV2KHRoZV9jYXJkKTsKKwkJdGhlX2NhcmQgPSBOVUxMOworCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfYXVkaW8uaCBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2F1ZGlvLmgKaW5kZXggY2M4ZDE1OS4uMDhmZmNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfYXVkaW8uaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9hdWRpby5oCkBAIC01MSw2ICs1MSw2IEBACiB9OwogCiBpbnQgZ2F1ZGlvX3NldHVwKHN0cnVjdCBnYXVkaW8gKmNhcmQpOwotdm9pZCBnYXVkaW9fY2xlYW51cChzdHJ1Y3QgZ2F1ZGlvICpjYXJkKTsKK3ZvaWQgZ2F1ZGlvX2NsZWFudXAodm9pZCk7CiAKICNlbmRpZiAvKiBfX1VfQVVESU9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKaW5kZXggMWQ4ZTM5YS4uMWViOWU0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCkBAIC02MCw2ICs2MCw3IEBACiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXBwbGVkaXNwbGF5X3RhYmxlIFtdID0gewogCXsgQVBQTEVESVNQTEFZX0RFVklDRSgweDkyMTgpIH0sCiAJeyBBUFBMRURJU1BMQVlfREVWSUNFKDB4OTIxOSkgfSwKKwl7IEFQUExFRElTUExBWV9ERVZJQ0UoMHg5MjFjKSB9LAogCXsgQVBQTEVESVNQTEFZX0RFVklDRSgweDkyMWQpIH0sCiAKIAkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwpAQCAtNzIsOCArNzMsOCBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwkvKiB1c2IgZGV2aWNlICovCiAJc3RydWN0IHVyYiAqdXJiOwkJLyogdXNiIHJlcXVlc3QgYmxvY2sgKi8KIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CS8qIGJhY2tsaWdodCBkZXZpY2UgKi8KLQljaGFyICp1cmJkYXRhOwkJCS8qIGludGVycnVwdCBVUkIgZGF0YSBidWZmZXIgKi8KLQljaGFyICptc2dkYXRhOwkJCS8qIGNvbnRyb2wgbWVzc2FnZSBkYXRhIGJ1ZmZlciAqLworCXU4ICp1cmJkYXRhOwkJCS8qIGludGVycnVwdCBVUkIgZGF0YSBidWZmZXIgKi8KKwl1OCAqbXNnZGF0YTsJCQkvKiBjb250cm9sIG1lc3NhZ2UgZGF0YSBidWZmZXIgKi8KIAogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlpbnQgYnV0dG9uX3ByZXNzZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2VtaTYyLmMgYi9kcml2ZXJzL3VzYi9taXNjL2VtaTYyLmMKaW5kZXggNjAyZWUwNS4uNTk4NjBiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9lbWk2Mi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pNjIuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQkJZ290byB3cmFwZXJyOwogCQl9Ci0JfSB3aGlsZSAoaSA+IDApOworCX0gd2hpbGUgKHJlYyk7CiAKIAkvKiBBc3NlcnQgcmVzZXQgKHN0b3AgdGhlIENQVSBpbiB0aGUgRU1JKSAqLwogCWVyciA9IGVtaTYyX3NldF9yZXNldChkZXYsMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmMgYi9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmMKaW5kZXggZmU0OTM0ZC4uYWQyNmU2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uYwpAQCAtMjksNiArMjksOCBAQAogewogCXZvaWQgX19pb21lbSAqZmlmbyA9IGh3X2VwLT5maWZvOwogCXZvaWQgX19pb21lbSAqZXBpbyA9IGh3X2VwLT5yZWdzOworCXU4IGVwbnVtID0gaHdfZXAtPmVwbnVtOworCXUxNiBkbWFfcmVnID0gMDsKIAogCXByZWZldGNoKCh1OCAqKXNyYyk7CiAKQEAgLTM5LDY3ICs0MSwxMTMgQEAKIAogCWR1bXBfZmlmb19kYXRhKHNyYywgbGVuKTsKIAotCWlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZylzcmMgJiAweDAxKSkKLQkJb3V0c3dfOCgodW5zaWduZWQgbG9uZylmaWZvLCBzcmMsCi0JCQlsZW4gJiAweDAxID8gKGxlbiA+PiAxKSArIDEgOiBsZW4gPj4gMSk7Ci0JZWxzZQotCQlvdXRzdygodW5zaWduZWQgbG9uZylmaWZvLCBzcmMsCi0JCQlsZW4gJiAweDAxID8gKGxlbiA+PiAxKSArIDEgOiBsZW4gPj4gMSk7Ci19CisJaWYgKCFBTk9NQUxZXzA1MDAwMzgwICYmIGVwbnVtICE9IDApIHsKKwkJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBpbnQpc3JjLAorCQkJKHVuc2lnbmVkIGludCkoc3JjICsgbGVuKSk7CiAKKwkJLyogU2V0dXAgRE1BIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwkJZG1hX3JlZyA9ICh1MTYpICgodTMyKSBzcmMgJiAweEZGRkYpOworCQliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0FERFJfTE9XKSwgZG1hX3JlZyk7CisJCVNTWU5DKCk7CisKKwkJZG1hX3JlZyA9ICh1MTYpICgoKHUzMikgc3JjID4+IDE2KSAmIDB4RkZGRik7CisJCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQUREUl9ISUdIKSwgZG1hX3JlZyk7CisJCVNTWU5DKCk7CisKKwkJLyogU2V0dXAgRE1BIGNvdW50IHJlZ2lzdGVyICovCisJCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ09VTlRfTE9XKSwgbGVuKTsKKwkJYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9DT1VOVF9ISUdIKSwgMCk7CisJCVNTWU5DKCk7CisKKwkJLyogRW5hYmxlIHRoZSBETUEgKi8KKwkJZG1hX3JlZyA9IChlcG51bSA8PCA0KSB8IERNQV9FTkEgfCBJTlRfRU5BIHwgRElSRUNUSU9OOworCQliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0NUUkwpLCBkbWFfcmVnKTsKKwkJU1NZTkMoKTsKKworCQkvKiBXYWl0IGZvciBjb21wZWxldGUgKi8KKwkJd2hpbGUgKCEoYmZpbl9yZWFkX1VTQl9ETUFfSU5URVJSVVBUKCkgJiAoMSA8PCBlcG51bSkpKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJLyogYWNrbm93bGVkZ2UgZG1hIGludGVycnVwdCAqLworCQliZmluX3dyaXRlX1VTQl9ETUFfSU5URVJSVVBUKDEgPDwgZXBudW0pOworCQlTU1lOQygpOworCisJCS8qIFJlc2V0IERNQSAqLworCQliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0NUUkwpLCAwKTsKKwkJU1NZTkMoKTsKKwl9IGVsc2UgeworCQlTU1lOQygpOworCisJCWlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZylzcmMgJiAweDAxKSkKKwkJCW91dHN3XzgoKHVuc2lnbmVkIGxvbmcpZmlmbywgc3JjLAorCQkJCWxlbiAmIDB4MDEgPyAobGVuID4+IDEpICsgMSA6IGxlbiA+PiAxKTsKKwkJZWxzZQorCQkJb3V0c3coKHVuc2lnbmVkIGxvbmcpZmlmbywgc3JjLAorCQkJCWxlbiAmIDB4MDEgPyAobGVuID4+IDEpICsgMSA6IGxlbiA+PiAxKTsKKworCX0KK30KIC8qCiAgKiBVbmxvYWQgYW4gZW5kcG9pbnQncyBGSUZPCiAgKi8KIHZvaWQgbXVzYl9yZWFkX2ZpZm8oc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwLCB1MTYgbGVuLCB1OCAqZHN0KQogewogCXZvaWQgX19pb21lbSAqZmlmbyA9IGh3X2VwLT5maWZvOwotCi0jaWZkZWYgQ09ORklHX0JGNTJ4CiAJdTggZXBudW0gPSBod19lcC0+ZXBudW07CiAJdTE2IGRtYV9yZWcgPSAwOwogCi0JaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGludClkc3QsCi0JCSh1bnNpZ25lZCBpbnQpKGRzdCArIGxlbikpOworCWlmIChBTk9NQUxZXzA1MDAwNDY3ICYmIGVwbnVtICE9IDApIHsKIAotCS8qIFNldHVwIERNQSBhZGRyZXNzIHJlZ2lzdGVyICovCi0JZG1hX3JlZyA9ICh1MTYpICgodTMyKSBkc3QgJiAweEZGRkYpOwotCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQUREUl9MT1cpLCBkbWFfcmVnKTsKLQlTU1lOQygpOworCQlpbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgaW50KWRzdCwKKwkJCSh1bnNpZ25lZCBpbnQpKGRzdCArIGxlbikpOwogCi0JZG1hX3JlZyA9ICh1MTYpICgoKHUzMikgZHN0ID4+IDE2KSAmIDB4RkZGRik7Ci0JYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9BRERSX0hJR0gpLCBkbWFfcmVnKTsKLQlTU1lOQygpOworCQkvKiBTZXR1cCBETUEgYWRkcmVzcyByZWdpc3RlciAqLworCQlkbWFfcmVnID0gKHUxNikgKCh1MzIpIGRzdCAmIDB4RkZGRik7CisJCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQUREUl9MT1cpLCBkbWFfcmVnKTsKKwkJU1NZTkMoKTsKIAotCS8qIFNldHVwIERNQSBjb3VudCByZWdpc3RlciAqLwotCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ09VTlRfTE9XKSwgbGVuKTsKLQliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0NPVU5UX0hJR0gpLCAwKTsKLQlTU1lOQygpOworCQlkbWFfcmVnID0gKHUxNikgKCgodTMyKSBkc3QgPj4gMTYpICYgMHhGRkZGKTsKKwkJYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9BRERSX0hJR0gpLCBkbWFfcmVnKTsKKwkJU1NZTkMoKTsKIAotCS8qIEVuYWJsZSB0aGUgRE1BICovCi0JZG1hX3JlZyA9IChlcG51bSA8PCA0KSB8IERNQV9FTkEgfCBJTlRfRU5BOwotCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ1RSTCksIGRtYV9yZWcpOwotCVNTWU5DKCk7CisJCS8qIFNldHVwIERNQSBjb3VudCByZWdpc3RlciAqLworCQliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0NPVU5UX0xPVyksIGxlbik7CisJCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ09VTlRfSElHSCksIDApOworCQlTU1lOQygpOwogCi0JLyogV2FpdCBmb3IgY29tcGVsZXRlICovCi0Jd2hpbGUgKCEoYmZpbl9yZWFkX1VTQl9ETUFfSU5URVJSVVBUKCkgJiAoMSA8PCBlcG51bSkpKQotCQljcHVfcmVsYXgoKTsKKwkJLyogRW5hYmxlIHRoZSBETUEgKi8KKwkJZG1hX3JlZyA9IChlcG51bSA8PCA0KSB8IERNQV9FTkEgfCBJTlRfRU5BOworCQliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0NUUkwpLCBkbWFfcmVnKTsKKwkJU1NZTkMoKTsKIAotCS8qIGFja25vd2xlZGdlIGRtYSBpbnRlcnJ1cHQgKi8KLQliZmluX3dyaXRlX1VTQl9ETUFfSU5URVJSVVBUKDEgPDwgZXBudW0pOwotCVNTWU5DKCk7CisJCS8qIFdhaXQgZm9yIGNvbXBlbGV0ZSAqLworCQl3aGlsZSAoIShiZmluX3JlYWRfVVNCX0RNQV9JTlRFUlJVUFQoKSAmICgxIDw8IGVwbnVtKSkpCisJCQljcHVfcmVsYXgoKTsKIAotCS8qIFJlc2V0IERNQSAqLwotCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ1RSTCksIDApOwotCVNTWU5DKCk7Ci0jZWxzZQotCWlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZylkc3QgJiAweDAxKSkKLQkJaW5zd184KCh1bnNpZ25lZCBsb25nKWZpZm8sIGRzdCwKLQkJCWxlbiAmIDB4MDEgPyAobGVuID4+IDEpICsgMSA6IGxlbiA+PiAxKTsKLQllbHNlCi0JCWluc3coKHVuc2lnbmVkIGxvbmcpZmlmbywgZHN0LAotCQkJbGVuICYgMHgwMSA/IChsZW4gPj4gMSkgKyAxIDogbGVuID4+IDEpOwotI2VuZGlmCisJCS8qIGFja25vd2xlZGdlIGRtYSBpbnRlcnJ1cHQgKi8KKwkJYmZpbl93cml0ZV9VU0JfRE1BX0lOVEVSUlVQVCgxIDw8IGVwbnVtKTsKKwkJU1NZTkMoKTsKIAorCQkvKiBSZXNldCBETUEgKi8KKwkJYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9DVFJMKSwgMCk7CisJCVNTWU5DKCk7CisJfSBlbHNlIHsKKwkJU1NZTkMoKTsKKwkJLyogUmVhZCB0aGUgbGFzdCBieXRlIG9mIHBhY2tldCB3aXRoIG9kZCBzaXplIGZyb20gYWRkcmVzcyBmaWZvICsgNAorCQkgKiB0byB0cmlnZ2VyIDEgYnl0ZSBhY2Nlc3MgdG8gRVAwIEZJRk8uCisJCSAqLworCQlpZiAobGVuID09IDEpCisJCQkqZHN0ID0gKHU4KWludygodW5zaWduZWQgbG9uZylmaWZvICsgNCk7CisJCWVsc2UgeworCQkJaWYgKHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKWRzdCAmIDB4MDEpKQorCQkJCWluc3dfOCgodW5zaWduZWQgbG9uZylmaWZvLCBkc3QsIGxlbiA+PiAxKTsKKwkJCWVsc2UKKwkJCQlpbnN3KCh1bnNpZ25lZCBsb25nKWZpZm8sIGRzdCwgbGVuID4+IDEpOworCisJCQlpZiAobGVuICYgMHgwMSkKKwkJCQkqKGRzdCArIGxlbiAtIDEpID0gKHU4KWludygodW5zaWduZWQgbG9uZylmaWZvICsgNCk7CisJCX0KKwl9CiAJREJHKDQsICIlY1ggZXAlZCBmaWZvICVwIGNvdW50ICVkIGJ1ZiAlcFxuIiwKIAkJCSdSJywgaHdfZXAtPmVwbnVtLCBmaWZvLCBsZW4sIGRzdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uaCBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uaAppbmRleCAxMGI3ZDc1Li5iZDkzNTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmgKKysrIGIvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oCkBAIC02OSw3ICs2OSw2IEBACiAjZGVmaW5lIGR1bXBfZmlmb19kYXRhKGJ1ZiwgbGVuKQlkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0JGNTJ4CiAKICNkZWZpbmUgVVNCX0RNQV9CQVNFCQlVU0JfRE1BX0lOVEVSUlVQVAogI2RlZmluZSBVU0JfRE1BeF9DVFJMCQkweDA0CkBAIC03OSw3ICs3OCw2IEBACiAjZGVmaW5lIFVTQl9ETUF4X0NPVU5UX0hJR0gJMHgxNAogCiAjZGVmaW5lIFVTQl9ETUFfUkVHKGVwLCByZWcpCShVU0JfRE1BX0JBU0UgKyAweDIwICogZXAgKyByZWcpCi0jZW5kaWYKIAogLyogQWxtb3N0IDEgc2Vjb25kICovCiAjZGVmaW5lIFRJTUVSX0RFTEFZCSgxICogSFopCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2NwcGlfZG1hLmMgYi9kcml2ZXJzL3VzYi9tdXNiL2NwcGlfZG1hLmMKaW5kZXggZWYyMzMyYS4uYTQ0YTQ1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9jcHBpX2RtYS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvY3BwaV9kbWEuYwpAQCAtMTE1NCw4ICsxMTU0LDExIEBACiAJc3RydWN0IG11c2JfaHdfZXAJKmh3X2VwID0gTlVMTDsKIAl1MzIJCQlyeCwgdHg7CiAJaW50CQkJaSwgaW5kZXg7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAljcHBpID0gY29udGFpbmVyX29mKG11c2ItPmRtYV9jb250cm9sbGVyLCBzdHJ1Y3QgY3BwaSwgY29udHJvbGxlcik7CisJaWYgKGNwcGktPmlycSkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIAogCXRpYmFzZSA9IG11c2ItPmN0cmxfYmFzZTsKIApAQCAtMTI4NSw2ICsxMjg4LDkgQEAKIAkvKiB3cml0ZSB0byBDUFBJIEVPSSByZWdpc3RlciB0byByZS1lbmFibGUgaW50ZXJydXB0cyAqLwogCW11c2Jfd3JpdGVsKHRpYmFzZSwgREFWSU5DSV9DUFBJX0VPSV9SRUcsIDApOwogCisJaWYgKGNwcGktPmlycSkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYyBiL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jCmluZGV4IGUxNmZmNjAuLjY2OTEzODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSAibXVzYl9jb3JlLmgiCiAKICNpZmRlZiBDT05GSUdfTUFDSF9EQVZJTkNJX0VWTQotI2RlZmluZSBHUElPX25WQlVTX0RSVgkJMTQ0CisjZGVmaW5lIEdQSU9fblZCVVNfRFJWCQkxNjAKICNlbmRpZgogCiAjaW5jbHVkZSAiZGF2aW5jaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKaW5kZXggYmZlMDhmNC4uNWViOTMxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC0xMzE5LDcgKzEzMTksNyBAQAogI2VuZGlmCiAJdTggcmVnOwogCWNoYXIgKnR5cGU7Ci0JY2hhciBhSW5mb1s3OF0sIGFSZXZpc2lvblszMl0sIGFEYXRlWzEyXTsKKwljaGFyIGFJbmZvWzkwXSwgYVJldmlzaW9uWzMyXSwgYURhdGVbMTJdOwogCXZvaWQgX19pb21lbQkqbWJhc2UgPSBtdXNiLT5tcmVnczsKIAlpbnQJCXN0YXR1cyA9IDA7CiAJaW50CQlpOwpAQCAtMTUyMSw2ICsxNTIxLDE0IEBACiAJCShkZXZjdGwgJiBNVVNCX0RFVkNUTF9ITSkgPyAiaG9zdCIgOiAicGVyaXBoZXJhbCIsCiAJCW11c2ItPmludF91c2IsIG11c2ItPmludF90eCwgbXVzYi0+aW50X3J4KTsKIAorI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQworCWlmIChpc19vdGdfZW5hYmxlZChtdXNiKSB8fCBpc19wZXJpcGhlcmFsX2VuYWJsZWQobXVzYikpCisJCWlmICghbXVzYi0+Z2FkZ2V0X2RyaXZlcikgeworCQkJREJHKDUsICJObyBnYWRnZXQgZHJpdmVyIGxvYWRlZFxuIik7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKyNlbmRpZgorCiAJLyogdGhlIGNvcmUgY2FuIGludGVycnVwdCB1cyBmb3IgbXVsdGlwbGUgcmVhc29uczsgZG9jcyBoYXZlCiAJICogYSBnZW5lcmljIGludGVycnVwdCBmbG93Y2hhcnQgdG8gZm9sbG93CiAJICovCkBAIC0yMTM5LDcgKzIxNDcsNyBAQAogCXJldHVybiBtdXNiX2luaXRfY29udHJvbGxlcihkZXYsIGlycSwgYmFzZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IG11c2JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZXhpdCBtdXNiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtdXNiCSptdXNiID0gZGV2X3RvX211c2IoJnBkZXYtPmRldik7CiAJdm9pZCBfX2lvbWVtCSpjdHJsX2Jhc2UgPSBtdXNiLT5jdHJsX2Jhc2U7CkBAIC0yMjMxLDcgKzIyMzksNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wbQkJPSBNVVNCX0RFVl9QTV9PUFMsCiAJfSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG11c2JfcmVtb3ZlKSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKG11c2JfcmVtb3ZlKSwKIAkuc2h1dGRvd24JPSBtdXNiX3NodXRkb3duLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCmluZGV4IGM0OWI5YmEuLmNiY2YxNGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCkBAIC0zMDksNyArMzA5LDcgQEAKIAkJCXNpemVfdCByZXF1ZXN0X3NpemU7CiAKIAkJCS8qIHNldHVwIERNQSwgdGhlbiBwcm9ncmFtIGVuZHBvaW50IENTUiAqLwotCQkJcmVxdWVzdF9zaXplID0gbWluKHJlcXVlc3QtPmxlbmd0aCwKKwkJCXJlcXVlc3Rfc2l6ZSA9IG1pbl90KHNpemVfdCwgcmVxdWVzdC0+bGVuZ3RoLAogCQkJCQkJbXVzYl9lcC0+ZG1hLT5tYXhfbGVuKTsKIAkJCWlmIChyZXF1ZXN0X3NpemUgPCBtdXNiX2VwLT5wYWNrZXRfc3opCiAJCQkJbXVzYl9lcC0+ZG1hLT5kZXNpcmVkX21vZGUgPSAwOwpAQCAtMzE5LDcgKzMxOSw3IEBACiAJCQl1c2VfZG1hID0gdXNlX2RtYSAmJiBjLT5jaGFubmVsX3Byb2dyYW0oCiAJCQkJCW11c2JfZXAtPmRtYSwgbXVzYl9lcC0+cGFja2V0X3N6LAogCQkJCQltdXNiX2VwLT5kbWEtPmRlc2lyZWRfbW9kZSwKLQkJCQkJcmVxdWVzdC0+ZG1hLCByZXF1ZXN0X3NpemUpOworCQkJCQlyZXF1ZXN0LT5kbWEgKyByZXF1ZXN0LT5hY3R1YWwsIHJlcXVlc3Rfc2l6ZSk7CiAJCQlpZiAodXNlX2RtYSkgewogCQkJCWlmIChtdXNiX2VwLT5kbWEtPmRlc2lyZWRfbW9kZSA9PSAwKSB7CiAJCQkJCS8qCkBAIC01MTUsMTIgKzUxNSwxMiBAQAogCQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKQogCQkJCXJldHVybjsKIAotCQkJaWYgKCFtdXNiX2VwLT5kZXNjKSB7CisJCQlyZXF1ZXN0ID0gbXVzYl9lcC0+ZGVzYyA/IG5leHRfcmVxdWVzdChtdXNiX2VwKSA6IE5VTEw7CisJCQlpZiAoIXJlcXVlc3QpIHsKIAkJCQlEQkcoNCwgIiVzIGlkbGUgbm93XG4iLAogCQkJCQltdXNiX2VwLT5lbmRfcG9pbnQubmFtZSk7CiAJCQkJcmV0dXJuOwotCQkJfSBlbHNlCi0JCQkJcmVxdWVzdCA9IG5leHRfcmVxdWVzdChtdXNiX2VwKTsKKwkJCX0KIAkJfQogCiAJCXR4c3RhdGUobXVzYiwgdG9fbXVzYl9yZXF1ZXN0KHJlcXVlc3QpKTsKQEAgLTc0Niw2ICs3NDYsOCBAQAogCW11c2JfZXBfc2VsZWN0KG1iYXNlLCBlcG51bSk7CiAKIAlyZXF1ZXN0ID0gbmV4dF9yZXF1ZXN0KG11c2JfZXApOworCWlmICghcmVxdWVzdCkKKwkJcmV0dXJuOwogCiAJY3NyID0gbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1JYQ1NSKTsKIAlkbWEgPSBpc19kbWFfY2FwYWJsZSgpID8gbXVzYl9lcC0+ZG1hIDogTlVMTDsKQEAgLTE3MzEsNiArMTczMyw3IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZtdXNiLT5sb2NrLCBmbGFncyk7CiAKIAkJb3RnX3NldF9wZXJpcGhlcmFsKG11c2ItPnhjZWl2LCAmbXVzYi0+Zyk7CisJCW11c2ItPnhjZWl2LT5zdGF0ZSA9IE9UR19TVEFURV9CX0lETEU7CiAJCW11c2ItPmlzX2FjdGl2ZSA9IDE7CiAKIAkJLyogRklYTUUgdGhpcyBpZ25vcmVzIHRoZSBzb2Z0Y29ubmVjdCBmbGFnLiAgRHJpdmVycyBhcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXRfZXAwLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0X2VwMC5jCmluZGV4IDhmYmEzZjEuLjUzZDA2NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXRfZXAwLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldF9lcDAuYwpAQCAtNjY0LDcgKzY2NCw3IEBACiAJCQltdXNiLT5lcDBfc3RhdGUgPSBNVVNCX0VQMF9TVEFHRV9TVEFUVVNJTjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJRVJSKCJTZXR1cEVuZCBjYW1lIGluIGEgd3JvbmcgZXAwc3RhZ2UgJXMiLAorCQkJRVJSKCJTZXR1cEVuZCBjYW1lIGluIGEgd3JvbmcgZXAwc3RhZ2UgJXNcbiIsCiAJCQkgICAgZGVjb2RlX2VwMHN0YWdlKG11c2ItPmVwMF9zdGF0ZSkpOwogCQl9CiAJCWNzciA9IG11c2JfcmVhZHcocmVncywgTVVTQl9DU1IwKTsKQEAgLTc4NywxMiArNzg3LDE4IEBACiAJCQkJaGFuZGxlZCA9IHNlcnZpY2VfemVyb19kYXRhX3JlcXVlc3QoCiAJCQkJCQltdXNiLCAmc2V0dXApOwogCisJCQkJLyoKKwkJCQkgKiBXZSdyZSBleHBlY3Rpbmcgbm8gZGF0YSBpbiBhbnkgY2FzZSwgc28KKwkJCQkgKiBhbHdheXMgc2V0IHRoZSBEQVRBRU5EIGJpdCAtLSBkb2luZyB0aGlzCisJCQkJICogaGVyZSBoZWxwcyBhdm9pZCBTZXR1cEVuZCBpbnRlcnJ1cHQgY29taW5nCisJCQkJICogaW4gdGhlIGlkbGUgc3RhZ2Ugd2hlbiB3ZSdyZSBzdGFsbGluZy4uLgorCQkJCSAqLworCQkJCW11c2ItPmFja3BlbmQgfD0gTVVTQl9DU1IwX1BfREFUQUVORDsKKwogCQkJCS8qIHN0YXR1cyBzdGFnZSBtaWdodCBiZSBpbW1lZGlhdGUgKi8KLQkJCQlpZiAoaGFuZGxlZCA+IDApIHsKLQkJCQkJbXVzYi0+YWNrcGVuZCB8PSBNVVNCX0NTUjBfUF9EQVRBRU5EOworCQkJCWlmIChoYW5kbGVkID4gMCkKIAkJCQkJbXVzYi0+ZXAwX3N0YXRlID0KIAkJCQkJCU1VU0JfRVAwX1NUQUdFX1NUQVRVU0lOOwotCQkJCX0KIAkJCQlicmVhazsKIAogCQkJLyogc2VxdWVuY2UgIzEgKElOIHRvIGhvc3QpLCBpbmNsdWRlcyBHRVRfU1RBVFVTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvaXNwMTMwMV9vbWFwLmMgYi9kcml2ZXJzL3VzYi9vdGcvaXNwMTMwMV9vbWFwLmMKaW5kZXggZDU0NDYwYS4uNzhhMjA5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivb3RnL2lzcDEzMDFfb21hcC5jCisrKyBiL2RyaXZlcnMvdXNiL290Zy9pc3AxMzAxX29tYXAuYwpAQCAtODQzLDcgKzg0Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvdGdfZGV2OwogCi1zdGF0aWMgaW50IG90Z19pbml0KHN0cnVjdCBpc3AxMzAxICppc3ApCitzdGF0aWMgaW50IGlzcDEzMDFfb3RnX2luaXQoc3RydWN0IGlzcDEzMDEgKmlzcCkKIHsKIAl1MzIgbDsKIApAQCAtMTI3NSw3ICsxMjc1LDcgQEAKIHN0YXRpYyBpbnQgaXNwMTMwMV9vdGdfZW5hYmxlKHN0cnVjdCBpc3AxMzAxICppc3ApCiB7CiAJcG93ZXJfdXAoaXNwKTsKLQlvdGdfaW5pdChpc3ApOworCWlzcDEzMDFfb3RnX2luaXQoaXNwKTsKIAogCS8qIE5PVEU6ICBzaW5jZSB3ZSBkb24ndCBjaGFuZ2UgdGhpcywgdGhpcyBwcm92aWRlcwogCSAqIGEgZmV3IG1vcmUgaW50ZXJydXB0cyB0aGFuIGFyZSBzdHJpY3RseSBuZWVkZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IGY5OTQ5OGYuLjIxNmYxODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgogI2luY2x1ZGUgImZ0ZGlfc2lvLmgiCisjaW5jbHVkZSAiZnRkaV9zaW9faWRzLmgiCiAKIC8qCiAgKiBWZXJzaW9uIEluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCmluZGV4IDQ1ODZhMjQuLmIwZTBkNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCkBAIC0xLDcgKzEsMTAgQEAKIC8qCi0gKiBEZWZpbml0aW9ucyBmb3IgdGhlIEZUREkgVVNCIFNpbmdsZSBQb3J0IFNlcmlhbCBDb252ZXJ0ZXIgLQorICogRHJpdmVyIGRlZmluaXRpb25zIGZvciB0aGUgRlRESSBVU0IgU2luZ2xlIFBvcnQgU2VyaWFsIENvbnZlcnRlciAtCiAgKiBrbm93biBhcyBGVERJX1NJTyAoU2VyaWFsIElucHV0L091dHB1dCBhcHBsaWNhdGlvbiBvZiB0aGUgY2hpcHNldCkKICAqCisgKiBGb3IgVVNCIHZlbmRvci9wcm9kdWN0IElEcyAoVklEL1BJRCksIHBsZWFzZSBzZWUgZnRkaV9zaW9faWRzLmgKKyAqCisgKgogICogVGhlIGV4YW1wbGUgSSBoYXZlIGlzIGtub3duIGFzIHRoZSBVU0MtMTAwMCB3aGljaCBpcyBhdmFpbGFibGUgZnJvbQogICogaHR0cDovL3d3dy5kc2UuY28ubnogLSBjYXQgbm8gWEg0MjE0IEl0IGxvb2tzIHNpbWlsYXIgdG8gdGhpczoKICAqIGh0dHA6Ly93d3cuZGFuc2RhdGEuY29tL3VzYnNlci5odG0gYnV0IEkgY2FuJ3QgYmUgc3VyZSBUaGVyZSBhcmUgb3RoZXIKQEAgLTE3LDg4MSArMjAsOCBAQAogICogQmlsbCBSeWRlciAtIGJyeWRlckBzZ2kuY29tIGZvcm1lcmx5IG9mIFNpbGljb24gR3JhcGhpY3MsIEluYy4tIHdyb3RlIHRoZQogICogRlRESV9TSU8gaW1wbGVtZW50YXRpb24uCiAgKgotICogUGhpbGlwcCBHw7xocmluZyAtIHBnQGZ1dHVyZXdhcmUuYXQgLSBhZGRlZCB0aGUgRGV2aWNlIElEIG9mIHRoZSBVU0IgcmVsYWlzCi0gKiBmcm9tIFJ1ZG9sZiBHdWdsZXIKLSAqCiAgKi8KIAotI2RlZmluZSBGVERJX1ZJRAkweDA0MDMJLyogVmVuZG9yIElkICovCi0jZGVmaW5lIEZURElfU0lPX1BJRAkweDgzNzIJLyogUHJvZHVjdCBJZCBTSU8gYXBwbGljYXRpb24gb2YgOFUxMDBBWCAgKi8KLSNkZWZpbmUgRlRESV84VTIzMkFNX1BJRCAweDYwMDEgLyogU2ltaWxhciBkZXZpY2UgdG8gU0lPIGFib3ZlICovCi0jZGVmaW5lIEZURElfOFUyMzJBTV9BTFRfUElEIDB4NjAwNiAvKiBGVERJJ3MgYWx0ZXJuYXRlIFBJRCBmb3IgYWJvdmUgKi8KLSNkZWZpbmUgRlRESV84VTIyMzJDX1BJRCAweDYwMTAgLyogRHVhbCBjaGFubmVsIGRldmljZSAqLwotI2RlZmluZSBGVERJXzIzMlJMX1BJRCAgMHhGQkZBICAvKiBQcm9kdWN0IElEIGZvciBGVDIzMlJMICovCi0jZGVmaW5lIEZURElfNDIzMkhfUElEIDB4NjAxMSAvKiBRdWFkIGNoYW5uZWwgaGktc3BlZWQgZGV2aWNlICovCi0jZGVmaW5lIEZURElfUkVMQUlTX1BJRAkweEZBMTAgIC8qIFJlbGFpcyBkZXZpY2UgZnJvbSBSdWRvbGYgR3VnbGVyICovCi0jZGVmaW5lIEZURElfTkZfUklDX1ZJRAkweDBEQ0QJLyogVmVuZG9yIElkICovCi0jZGVmaW5lIEZURElfTkZfUklDX1BJRAkweDAwMDEJLyogUHJvZHVjdCBJZCAqLwotI2RlZmluZSBGVERJX1VTQlhfNzA3X1BJRCAweEY4NTcJLyogQURTVGVjaCBJUiBCbGFzdGVyIFVTQlgtNzA3ICovCi0KLS8qIExhcnNlbiBhbmQgQnJ1c2dhYXJkIEFsdGlUcmFjay9VU0J0cmFjayAgKi8KLSNkZWZpbmUgTEFSU0VOQlJVU0dBQVJEX1ZJRAkJMHgwRkQ4Ci0jZGVmaW5lIExCX0FMVElUUkFDS19QSUQJCTB4MDAwMQotCi0vKiB3d3cuY2FudXNiLmNvbSBMYXdpY2VsIENBTlVTQiBkZXZpY2UgKi8KLSNkZWZpbmUgRlRESV9DQU5VU0JfUElEIDB4RkZBOCAvKiBQcm9kdWN0IElkICovCi0KLS8qIEFscGhhTWljcm8gQ29tcG9uZW50cyBBTUMtMjMyVVNCMDEgZGV2aWNlICovCi0jZGVmaW5lIEZURElfQU1DMjMyX1BJRCAweEZGMDAgLyogUHJvZHVjdCBJZCAqLwotCi0vKiB3d3cuY2FuZGFwdGVyLmNvbSBFd2VydCBFbmVyZ3kgU3lzdGVtcyBDQU5kYXB0ZXIgZGV2aWNlICovCi0jZGVmaW5lIEZURElfQ0FOREFQVEVSX1BJRCAweDlGODAgLyogUHJvZHVjdCBJZCAqLwotCi0vKiBTQ1MgSEYgUmFkaW8gTW9kZW1zIFBJRCdzIChodHRwOi8vd3d3LnNjcy1wdGMuY29tKSAqLwotLyogdGhlIFZJRCBpcyB0aGUgc3RhbmRhcmQgZnRkaSB2aWQgKEZURElfVklEKSAqLwotI2RlZmluZSBGVERJX1NDU19ERVZJQ0VfMF9QSUQgMHhEMDEwICAgIC8qIFNDUyBQVEMtSUl1c2IgKi8KLSNkZWZpbmUgRlRESV9TQ1NfREVWSUNFXzFfUElEIDB4RDAxMSAgICAvKiBTQ1MgVHJhY2tlciAvIERTUCBUTkMgKi8KLSNkZWZpbmUgRlRESV9TQ1NfREVWSUNFXzJfUElEIDB4RDAxMgotI2RlZmluZSBGVERJX1NDU19ERVZJQ0VfM19QSUQgMHhEMDEzCi0jZGVmaW5lIEZURElfU0NTX0RFVklDRV80X1BJRCAweEQwMTQKLSNkZWZpbmUgRlRESV9TQ1NfREVWSUNFXzVfUElEIDB4RDAxNQotI2RlZmluZSBGVERJX1NDU19ERVZJQ0VfNl9QSUQgMHhEMDE2Ci0jZGVmaW5lIEZURElfU0NTX0RFVklDRV83X1BJRCAweEQwMTcKLQotLyogQUNUIFNvbHV0aW9ucyBIb21lUHJvIFpXYXZlIGludGVyZmFjZSAoaHR0cDovL3d3dy5hY3Qtc29sdXRpb25zLmNvbS9Ib21lUHJvLmh0bSkgKi8KLSNkZWZpbmUgRlRESV9BQ1RaV0FWRV9QSUQJMHhGMkQwCi0KLQotLyogd3d3LnN0YXJ0aW5nLXBvaW50LXN5c3RlbXMuY29tIMK1Q2hhbWVsZW9uIGRldmljZSAqLwotI2RlZmluZSBGVERJX01JQ1JPX0NIQU1FTEVPTl9QSUQJMHhDQUEwCS8qIFByb2R1Y3QgSWQgKi8KLQotLyogd3d3LmlydHJhbnMuZGUgZGV2aWNlICovCi0jZGVmaW5lIEZURElfSVJUUkFOU19QSUQgMHhGQzYwIC8qIFByb2R1Y3QgSWQgKi8KLQotCi0vKiB3d3cudGhvdWdodHRlY2hub2xvZ3kuY29tLyBUVC1VU0IgcHJvdmlkZSB3aXRoIHByb2NvbXAgdXNlIGZ0ZGlfc2lvICovCi0jZGVmaW5lIEZURElfVFRVU0JfUElEIDB4RkYyMCAvKiBQcm9kdWN0IElkICovCi0KLS8qIGlQbHVzIGRldmljZSAqLwotI2RlZmluZSBGVERJX0lQTFVTX1BJRCAweEQwNzAgLyogUHJvZHVjdCBJZCAqLwotI2RlZmluZSBGVERJX0lQTFVTMl9QSUQgMHhEMDcxIC8qIFByb2R1Y3QgSWQgKi8KLQotLyogRE1YNEFMTCBETVggSW50ZXJmYWNlcyAqLwotI2RlZmluZSBGVERJX0RNWDRBTEwgMHhDODUwCi0KLS8qIE9wZW5EQ0MgKHd3dy5vcGVuZGNjLmRlKSBwcm9kdWN0IGlkICovCi0jZGVmaW5lIEZURElfT1BFTkRDQ19QSUQJMHhCRkQ4Ci0jZGVmaW5lIEZURElfT1BFTkRDQ19TTklGRkVSX1BJRAkweEJGRDkKLSNkZWZpbmUgRlRESV9PUEVORENDX1RIUk9UVExFX1BJRAkweEJGREEKLSNkZWZpbmUgRlRESV9PUEVORENDX0dBVEVXQVlfUElECTB4QkZEQgotCi0vKiBTcHJvZyBJSSAoQW5kcmV3IENyb3NsYW5kJ3MgU3Byb2dJSSBEQ0MgaW50ZXJmYWNlKSAqLwotI2RlZmluZSBGVERJX1NQUk9HX0lJCQkweEYwQzgKLQotLyogd3d3LmNyeXN0YWxmb250ei5jb20gZGV2aWNlcyAtIHRoYW54IGZvciBwcm92aWRpbmcgZnJlZSBkZXZpY2VzIGZvciBldmFsdWF0aW9uICEgKi8KLS8qIHRoZXkgdXNlIHRoZSBmdGRpIGNoaXBzZXQgZm9yIHRoZSBVU0IgaW50ZXJmYWNlIGFuZCB0aGUgdmVuZG9yIGlkIGlzIHRoZSBzYW1lICovCi0jZGVmaW5lIEZURElfWEZfNjMyX1BJRCAweEZDMDgJLyogNjMyOiAxNngyIENoYXJhY3RlciBEaXNwbGF5ICovCi0jZGVmaW5lIEZURElfWEZfNjM0X1BJRCAweEZDMDkJLyogNjM0OiAyMHg0IENoYXJhY3RlciBEaXNwbGF5ICovCi0jZGVmaW5lIEZURElfWEZfNTQ3X1BJRCAweEZDMEEJLyogNTQ3OiBUd28gbGluZSBEaXNwbGF5ICovCi0jZGVmaW5lIEZURElfWEZfNjMzX1BJRCAweEZDMEIJLyogNjMzOiAxNngyIENoYXJhY3RlciBEaXNwbGF5IHdpdGggS2V5cyAqLwotI2RlZmluZSBGVERJX1hGXzYzMV9QSUQgMHhGQzBDCS8qIDYzMTogMjB4MiBDaGFyYWN0ZXIgRGlzcGxheSAqLwotI2RlZmluZSBGVERJX1hGXzYzNV9QSUQgMHhGQzBECS8qIDYzNTogMjB4NCBDaGFyYWN0ZXIgRGlzcGxheSAqLwotI2RlZmluZSBGVERJX1hGXzY0MF9QSUQgMHhGQzBFCS8qIDY0MDogVHdvIGxpbmUgRGlzcGxheSAqLwotI2RlZmluZSBGVERJX1hGXzY0Ml9QSUQgMHhGQzBGCS8qIDY0MjogVHdvIGxpbmUgRGlzcGxheSAqLwotCi0vKiBWaWRlbyBOZXR3b3JrcyBMaW1pdGVkIC8gSG9tZWNob2ljZSBpbiB0aGUgVUsgdXNlIGFuIGZ0ZGktYmFzZWQgZGV2aWNlIGZvciB0aGVpciAxTWIgKi8KLS8qIGJyb2FkYmFuZCBpbnRlcm5ldCBzZXJ2aWNlLiAgVGhlIGZvbGxvd2luZyBQSUQgaXMgZXhoaWJpdGVkIGJ5IHRoZSB1c2IgZGV2aWNlIHN1cHBsaWVkICovCi0vKiAodGhlIFZJRCBpcyB0aGUgc3RhbmRhcmQgZnRkaSB2aWQgKEZURElfVklEKSAqLwotI2RlZmluZSBGVERJX1ZOSENQQ1VTQl9EX1BJRCAweGZlMzggLyogUHJvZHVjdCBJZCAqLwotCi0vKgotICogUENESiB1c2UgZnRkaSBiYXNlZCBkai1jb250cm9sbGVycy4gIFRoZSBmb2xsb3dpbmcgUElEIGlzIGZvciB0aGVpciBEQUMtMiBkZXZpY2UKLSAqIGh0dHA6Ly93d3cucGNkamhhcmR3YXJlLmNvbS9EQUMyLmFzcCAoUElEIHNlbnQgYnkgV291dGVyIFBhZXNlbikKLSAqICh0aGUgVklEIGlzIHRoZSBzdGFuZGFyZCBmdGRpIHZpZCAoRlRESV9WSUQpICovCi0jZGVmaW5lIEZURElfUENESl9EQUMyX1BJRCAweEZBODgKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZSBNYXRyaXggT3JiaXRhbCBMQ0QgZGlzcGxheXMsCi0gKiB3aGljaCBhcmUgdGhlIEZUMjMyQk0gKCBzaW1pbGFyIHRvIHRoZSA4VTIzMkFNICkKLSAqLwotI2RlZmluZSBGVERJX01UWE9SQl8wX1BJRCAgICAgIDB4RkEwMCAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLwotI2RlZmluZSBGVERJX01UWE9SQl8xX1BJRCAgICAgIDB4RkEwMSAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLwotI2RlZmluZSBGVERJX01UWE9SQl8yX1BJRCAgICAgIDB4RkEwMiAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLwotI2RlZmluZSBGVERJX01UWE9SQl8zX1BJRCAgICAgIDB4RkEwMyAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLwotI2RlZmluZSBGVERJX01UWE9SQl80X1BJRCAgICAgIDB4RkEwNCAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLwotI2RlZmluZSBGVERJX01UWE9SQl81X1BJRCAgICAgIDB4RkEwNSAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLwotI2RlZmluZSBGVERJX01UWE9SQl82X1BJRCAgICAgIDB4RkEwNiAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLwotCi0vKiBPT0NEbGluayBieSBKb2VybiBLYWlwZiA8am9lcm5rQHdlYi5kZT4KLSAqIChodHRwOi8vd3d3LmpvZXJub25saW5lLmRlL2R3L2Rva3UucGhwP2lkPXN0YXJ0JmlkeD1wcm9qZWN0czpvb2NkbGluaykgKi8KLSNkZWZpbmUgRlRESV9PT0NETElOS19QSUQJMHhiYWY4CS8qIEFtb250ZWMgSlRBR2tleSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbHVlcyBmb3IgdGhlIE1hdHJpeCBPcmJpdGFsIEZUREkgUmFuZ2UKLSAqIEFueXRoaW5nIGluIHRoaXMgcmFuZ2Ugd2lsbCB1c2UgYW4gRlQyMzJSTC4KLSAqLwotI2RlZmluZSBNVFhPUkJfVklECQkJMHgxQjNECi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMDBfUElECTB4MDEwMAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTAxX1BJRAkweDAxMDEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwMl9QSUQJMHgwMTAyCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMDNfUElECTB4MDEwMwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTA0X1BJRAkweDAxMDQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwNV9QSUQJMHgwMTA1Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMDZfUElECTB4MDEwNgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTA3X1BJRAkweDAxMDcKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwOF9QSUQJMHgwMTA4Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMDlfUElECTB4MDEwOQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTBBX1BJRAkweDAxMEEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwQl9QSUQJMHgwMTBCCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMENfUElECTB4MDEwQwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTBEX1BJRAkweDAxMEQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwRV9QSUQJMHgwMTBFCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMEZfUElECTB4MDEwRgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTEwX1BJRAkweDAxMTAKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExMV9QSUQJMHgwMTExCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMTJfUElECTB4MDExMgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTEzX1BJRAkweDAxMTMKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExNF9QSUQJMHgwMTE0Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMTVfUElECTB4MDExNQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTE2X1BJRAkweDAxMTYKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExN19QSUQJMHgwMTE3Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMThfUElECTB4MDExOAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTE5X1BJRAkweDAxMTkKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExQV9QSUQJMHgwMTFBCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMUJfUElECTB4MDExQgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTFDX1BJRAkweDAxMUMKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExRF9QSUQJMHgwMTFECi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMUVfUElECTB4MDExRQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTFGX1BJRAkweDAxMUYKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyMF9QSUQJMHgwMTIwCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMjFfUElECTB4MDEyMQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTIyX1BJRAkweDAxMjIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyM19QSUQJMHgwMTIzCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMjRfUElECTB4MDEyNAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTI1X1BJRAkweDAxMjUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyNl9QSUQJMHgwMTI2Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMjdfUElECTB4MDEyNwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTI4X1BJRAkweDAxMjgKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyOV9QSUQJMHgwMTI5Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMkFfUElECTB4MDEyQQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTJCX1BJRAkweDAxMkIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyQ19QSUQJMHgwMTJDCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMkRfUElECTB4MDEyRAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTJFX1BJRAkweDAxMkUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyRl9QSUQJMHgwMTJGCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMzBfUElECTB4MDEzMAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTMxX1BJRAkweDAxMzEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzMl9QSUQJMHgwMTMyCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMzNfUElECTB4MDEzMwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTM0X1BJRAkweDAxMzQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzNV9QSUQJMHgwMTM1Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMzZfUElECTB4MDEzNgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTM3X1BJRAkweDAxMzcKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzOF9QSUQJMHgwMTM4Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMzlfUElECTB4MDEzOQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTNBX1BJRAkweDAxM0EKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzQl9QSUQJMHgwMTNCCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxM0NfUElECTB4MDEzQwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTNEX1BJRAkweDAxM0QKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzRV9QSUQJMHgwMTNFCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxM0ZfUElECTB4MDEzRgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTQwX1BJRAkweDAxNDAKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0MV9QSUQJMHgwMTQxCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNDJfUElECTB4MDE0MgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTQzX1BJRAkweDAxNDMKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0NF9QSUQJMHgwMTQ0Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNDVfUElECTB4MDE0NQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTQ2X1BJRAkweDAxNDYKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0N19QSUQJMHgwMTQ3Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNDhfUElECTB4MDE0OAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTQ5X1BJRAkweDAxNDkKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0QV9QSUQJMHgwMTRBCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNEJfUElECTB4MDE0QgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTRDX1BJRAkweDAxNEMKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0RF9QSUQJMHgwMTRECi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNEVfUElECTB4MDE0RQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTRGX1BJRAkweDAxNEYKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1MF9QSUQJMHgwMTUwCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNTFfUElECTB4MDE1MQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTUyX1BJRAkweDAxNTIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1M19QSUQJMHgwMTUzCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNTRfUElECTB4MDE1NAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTU1X1BJRAkweDAxNTUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1Nl9QSUQJMHgwMTU2Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNTdfUElECTB4MDE1NwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTU4X1BJRAkweDAxNTgKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1OV9QSUQJMHgwMTU5Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNUFfUElECTB4MDE1QQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTVCX1BJRAkweDAxNUIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1Q19QSUQJMHgwMTVDCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNURfUElECTB4MDE1RAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTVFX1BJRAkweDAxNUUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1Rl9QSUQJMHgwMTVGCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNjBfUElECTB4MDE2MAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTYxX1BJRAkweDAxNjEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2Ml9QSUQJMHgwMTYyCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNjNfUElECTB4MDE2MwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTY0X1BJRAkweDAxNjQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2NV9QSUQJMHgwMTY1Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNjZfUElECTB4MDE2NgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTY3X1BJRAkweDAxNjcKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2OF9QSUQJMHgwMTY4Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNjlfUElECTB4MDE2OQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTZBX1BJRAkweDAxNkEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2Ql9QSUQJMHgwMTZCCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNkNfUElECTB4MDE2QwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTZEX1BJRAkweDAxNkQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2RV9QSUQJMHgwMTZFCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNkZfUElECTB4MDE2RgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTcwX1BJRAkweDAxNzAKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3MV9QSUQJMHgwMTcxCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNzJfUElECTB4MDE3MgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTczX1BJRAkweDAxNzMKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3NF9QSUQJMHgwMTc0Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNzVfUElECTB4MDE3NQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTc2X1BJRAkweDAxNzYKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3N19QSUQJMHgwMTc3Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNzhfUElECTB4MDE3OAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTc5X1BJRAkweDAxNzkKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3QV9QSUQJMHgwMTdBCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxN0JfUElECTB4MDE3QgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTdDX1BJRAkweDAxN0MKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3RF9QSUQJMHgwMTdECi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxN0VfUElECTB4MDE3RQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTdGX1BJRAkweDAxN0YKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4MF9QSUQJMHgwMTgwCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxODFfUElECTB4MDE4MQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTgyX1BJRAkweDAxODIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4M19QSUQJMHgwMTgzCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxODRfUElECTB4MDE4NAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTg1X1BJRAkweDAxODUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4Nl9QSUQJMHgwMTg2Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxODdfUElECTB4MDE4NwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTg4X1BJRAkweDAxODgKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4OV9QSUQJMHgwMTg5Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOEFfUElECTB4MDE4QQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMThCX1BJRAkweDAxOEIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4Q19QSUQJMHgwMThDCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOERfUElECTB4MDE4RAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMThFX1BJRAkweDAxOEUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4Rl9QSUQJMHgwMThGCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOTBfUElECTB4MDE5MAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTkxX1BJRAkweDAxOTEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5Ml9QSUQJMHgwMTkyCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOTNfUElECTB4MDE5MwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTk0X1BJRAkweDAxOTQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5NV9QSUQJMHgwMTk1Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOTZfUElECTB4MDE5NgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTk3X1BJRAkweDAxOTcKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5OF9QSUQJMHgwMTk4Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOTlfUElECTB4MDE5OQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTlBX1BJRAkweDAxOUEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5Ql9QSUQJMHgwMTlCCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOUNfUElECTB4MDE5QwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTlEX1BJRAkweDAxOUQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5RV9QSUQJMHgwMTlFCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOUZfUElECTB4MDE5RgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUEwX1BJRAkweDAxQTAKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBMV9QSUQJMHgwMUExCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQTJfUElECTB4MDFBMgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUEzX1BJRAkweDAxQTMKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBNF9QSUQJMHgwMUE0Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQTVfUElECTB4MDFBNQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUE2X1BJRAkweDAxQTYKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBN19QSUQJMHgwMUE3Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQThfUElECTB4MDFBOAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUE5X1BJRAkweDAxQTkKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBQV9QSUQJMHgwMUFBCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQUJfUElECTB4MDFBQgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUFDX1BJRAkweDAxQUMKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBRF9QSUQJMHgwMUFECi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQUVfUElECTB4MDFBRQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUFGX1BJRAkweDAxQUYKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCMF9QSUQJMHgwMUIwCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQjFfUElECTB4MDFCMQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUIyX1BJRAkweDAxQjIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCM19QSUQJMHgwMUIzCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQjRfUElECTB4MDFCNAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUI1X1BJRAkweDAxQjUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCNl9QSUQJMHgwMUI2Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQjdfUElECTB4MDFCNwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUI4X1BJRAkweDAxQjgKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCOV9QSUQJMHgwMUI5Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQkFfUElECTB4MDFCQQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUJCX1BJRAkweDAxQkIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCQ19QSUQJMHgwMUJDCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQkRfUElECTB4MDFCRAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUJFX1BJRAkweDAxQkUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCRl9QSUQJMHgwMUJGCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQzBfUElECTB4MDFDMAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUMxX1BJRAkweDAxQzEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDMl9QSUQJMHgwMUMyCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQzNfUElECTB4MDFDMwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUM0X1BJRAkweDAxQzQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDNV9QSUQJMHgwMUM1Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQzZfUElECTB4MDFDNgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUM3X1BJRAkweDAxQzcKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDOF9QSUQJMHgwMUM4Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQzlfUElECTB4MDFDOQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUNBX1BJRAkweDAxQ0EKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDQl9QSUQJMHgwMUNCCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQ0NfUElECTB4MDFDQwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUNEX1BJRAkweDAxQ0QKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDRV9QSUQJMHgwMUNFCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQ0ZfUElECTB4MDFDRgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUQwX1BJRAkweDAxRDAKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFEMV9QSUQJMHgwMUQxCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRDJfUElECTB4MDFEMgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUQzX1BJRAkweDAxRDMKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFENF9QSUQJMHgwMUQ0Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRDVfUElECTB4MDFENQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUQ2X1BJRAkweDAxRDYKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFEN19QSUQJMHgwMUQ3Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRDhfUElECTB4MDFEOAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUQ5X1BJRAkweDAxRDkKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFEQV9QSUQJMHgwMURBCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxREJfUElECTB4MDFEQgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMURDX1BJRAkweDAxREMKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFERF9QSUQJMHgwMURECi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxREVfUElECTB4MDFERQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMURGX1BJRAkweDAxREYKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFMF9QSUQJMHgwMUUwCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRTFfUElECTB4MDFFMQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUUyX1BJRAkweDAxRTIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFM19QSUQJMHgwMUUzCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRTRfUElECTB4MDFFNAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUU1X1BJRAkweDAxRTUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFNl9QSUQJMHgwMUU2Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRTdfUElECTB4MDFFNwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUU4X1BJRAkweDAxRTgKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFOV9QSUQJMHgwMUU5Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRUFfUElECTB4MDFFQQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUVCX1BJRAkweDAxRUIKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFQ19QSUQJMHgwMUVDCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRURfUElECTB4MDFFRAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUVFX1BJRAkweDAxRUUKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFRl9QSUQJMHgwMUVGCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRjBfUElECTB4MDFGMAotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUYxX1BJRAkweDAxRjEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGMl9QSUQJMHgwMUYyCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRjNfUElECTB4MDFGMwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUY0X1BJRAkweDAxRjQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGNV9QSUQJMHgwMUY1Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRjZfUElECTB4MDFGNgotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUY3X1BJRAkweDAxRjcKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGOF9QSUQJMHgwMUY4Ci0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRjlfUElECTB4MDFGOQotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUZBX1BJRAkweDAxRkEKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGQl9QSUQJMHgwMUZCCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRkNfUElECTB4MDFGQwotI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUZEX1BJRAkweDAxRkQKLSNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGRV9QSUQJMHgwMUZFCi0jZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRkZfUElECTB4MDFGRgotCi0KLQotLyogSW50ZXJiaW9tZXRyaWNzIFVTQiBJL08gQm9hcmQgKi8KLS8qIERldmVsb3BlZCBmb3IgSW50ZXJiaW9tZXRyaWNzIGJ5IFJ1ZG9sZiBHdWdsZXIgKi8KLSNkZWZpbmUgSU5URVJCSU9NRVRSSUNTX1ZJRCAgICAgICAgICAgICAgMHgxMjA5Ci0jZGVmaW5lIElOVEVSQklPTUVUUklDU19JT0JPQVJEX1BJRCAgICAgIDB4MTAwMgotI2RlZmluZSBJTlRFUkJJT01FVFJJQ1NfTUlOSV9JT0JPQVJEX1BJRCAweDEwMDYKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZSBQZXJsZSBTeXN0ZW1zCi0gKiBVbHRyYVBvcnQgVVNCIHNlcmlhbCBjb252ZXJ0ZXJzCi0gKi8KLSNkZWZpbmUgRlRESV9QRVJMRV9VTFRSQVBPUlRfUElEIDB4RjBDMAkvKiBQZXJsZSBVbHRyYVBvcnQgUHJvZHVjdCBJZCAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbHVlcyBmb3IgdGhlIFNlYWxldmVsIFNlYUxJTksrIGFkYXB0ZXJzLgotICogKE9yaWdpbmFsIGxpc3Qgc2VudCBieSBUdWFuIEhvYW5nLiAgSWFuIEFiYm90dCByZW5hbWVkIHRoZSBtYWNyb3MgYW5kCi0gKiByZW1vdmVkIHNvbWUgUElEcyB0aGF0IGRvbid0IHNlZW0gdG8gbWF0Y2ggYW55IGV4aXN0aW5nIHByb2R1Y3RzLikKLSAqLwotI2RlZmluZSBTRUFMRVZFTF9WSUQJCTB4MGM1MgkvKiBTZWFsZXZlbCBWZW5kb3IgSUQgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjEwMV9QSUQJMHgyMTAxCS8qIFNlYUxJTksrMjMyICgyMTAxLzIxMDUpICovCi0jZGVmaW5lIFNFQUxFVkVMXzIxMDJfUElECTB4MjEwMgkvKiBTZWFMSU5LKzQ4NSAoMjEwMikgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjEwM19QSUQJMHgyMTAzCS8qIFNlYUxJTksrMjMySSAoMjEwMykgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjEwNF9QSUQJMHgyMTA0CS8qIFNlYUxJTksrNDg1SSAoMjEwNCkgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjEwNl9QSUQJMHg5MDIwCS8qIFNlYUxJTksrNDIyICgyMTA2KSAqLwotI2RlZmluZSBTRUFMRVZFTF8yMjAxXzFfUElECTB4MjIxMQkvKiBTZWFQT1JUKzIvMjMyICgyMjAxKSBQb3J0IDEgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjIwMV8yX1BJRAkweDIyMjEJLyogU2VhUE9SVCsyLzIzMiAoMjIwMSkgUG9ydCAyICovCi0jZGVmaW5lIFNFQUxFVkVMXzIyMDJfMV9QSUQJMHgyMjEyCS8qIFNlYVBPUlQrMi80ODUgKDIyMDIpIFBvcnQgMSAqLwotI2RlZmluZSBTRUFMRVZFTF8yMjAyXzJfUElECTB4MjIyMgkvKiBTZWFQT1JUKzIvNDg1ICgyMjAyKSBQb3J0IDIgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjIwM18xX1BJRAkweDIyMTMJLyogU2VhUE9SVCsyICgyMjAzKSBQb3J0IDEgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjIwM18yX1BJRAkweDIyMjMJLyogU2VhUE9SVCsyICgyMjAzKSBQb3J0IDIgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjQwMV8xX1BJRAkweDI0MTEJLyogU2VhUE9SVCs0LzIzMiAoMjQwMSkgUG9ydCAxICovCi0jZGVmaW5lIFNFQUxFVkVMXzI0MDFfMl9QSUQJMHgyNDIxCS8qIFNlYVBPUlQrNC8yMzIgKDI0MDEpIFBvcnQgMiAqLwotI2RlZmluZSBTRUFMRVZFTF8yNDAxXzNfUElECTB4MjQzMQkvKiBTZWFQT1JUKzQvMjMyICgyNDAxKSBQb3J0IDMgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjQwMV80X1BJRAkweDI0NDEJLyogU2VhUE9SVCs0LzIzMiAoMjQwMSkgUG9ydCA0ICovCi0jZGVmaW5lIFNFQUxFVkVMXzI0MDJfMV9QSUQJMHgyNDEyCS8qIFNlYVBPUlQrNC80ODUgKDI0MDIpIFBvcnQgMSAqLwotI2RlZmluZSBTRUFMRVZFTF8yNDAyXzJfUElECTB4MjQyMgkvKiBTZWFQT1JUKzQvNDg1ICgyNDAyKSBQb3J0IDIgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjQwMl8zX1BJRAkweDI0MzIJLyogU2VhUE9SVCs0LzQ4NSAoMjQwMikgUG9ydCAzICovCi0jZGVmaW5lIFNFQUxFVkVMXzI0MDJfNF9QSUQJMHgyNDQyCS8qIFNlYVBPUlQrNC80ODUgKDI0MDIpIFBvcnQgNCAqLwotI2RlZmluZSBTRUFMRVZFTF8yNDAzXzFfUElECTB4MjQxMwkvKiBTZWFQT1JUKzQgKDI0MDMpIFBvcnQgMSAqLwotI2RlZmluZSBTRUFMRVZFTF8yNDAzXzJfUElECTB4MjQyMwkvKiBTZWFQT1JUKzQgKDI0MDMpIFBvcnQgMiAqLwotI2RlZmluZSBTRUFMRVZFTF8yNDAzXzNfUElECTB4MjQzMwkvKiBTZWFQT1JUKzQgKDI0MDMpIFBvcnQgMyAqLwotI2RlZmluZSBTRUFMRVZFTF8yNDAzXzRfUElECTB4MjQ0MwkvKiBTZWFQT1JUKzQgKDI0MDMpIFBvcnQgNCAqLwotI2RlZmluZSBTRUFMRVZFTF8yODAxXzFfUElECTBYMjgxMQkvKiBTZWFMSU5LKzgvMjMyICgyODAxKSBQb3J0IDEgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjgwMV8yX1BJRAkwWDI4MjEJLyogU2VhTElOSys4LzIzMiAoMjgwMSkgUG9ydCAyICovCi0jZGVmaW5lIFNFQUxFVkVMXzI4MDFfM19QSUQJMFgyODMxCS8qIFNlYUxJTksrOC8yMzIgKDI4MDEpIFBvcnQgMyAqLwotI2RlZmluZSBTRUFMRVZFTF8yODAxXzRfUElECTBYMjg0MQkvKiBTZWFMSU5LKzgvMjMyICgyODAxKSBQb3J0IDQgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjgwMV81X1BJRAkwWDI4NTEJLyogU2VhTElOSys4LzIzMiAoMjgwMSkgUG9ydCA1ICovCi0jZGVmaW5lIFNFQUxFVkVMXzI4MDFfNl9QSUQJMFgyODYxCS8qIFNlYUxJTksrOC8yMzIgKDI4MDEpIFBvcnQgNiAqLwotI2RlZmluZSBTRUFMRVZFTF8yODAxXzdfUElECTBYMjg3MQkvKiBTZWFMSU5LKzgvMjMyICgyODAxKSBQb3J0IDcgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjgwMV84X1BJRAkwWDI4ODEJLyogU2VhTElOSys4LzIzMiAoMjgwMSkgUG9ydCA4ICovCi0jZGVmaW5lIFNFQUxFVkVMXzI4MDJfMV9QSUQJMFgyODEyCS8qIFNlYUxJTksrOC80ODUgKDI4MDIpIFBvcnQgMSAqLwotI2RlZmluZSBTRUFMRVZFTF8yODAyXzJfUElECTBYMjgyMgkvKiBTZWFMSU5LKzgvNDg1ICgyODAyKSBQb3J0IDIgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjgwMl8zX1BJRAkwWDI4MzIJLyogU2VhTElOSys4LzQ4NSAoMjgwMikgUG9ydCAzICovCi0jZGVmaW5lIFNFQUxFVkVMXzI4MDJfNF9QSUQJMFgyODQyCS8qIFNlYUxJTksrOC80ODUgKDI4MDIpIFBvcnQgNCAqLwotI2RlZmluZSBTRUFMRVZFTF8yODAyXzVfUElECTBYMjg1MgkvKiBTZWFMSU5LKzgvNDg1ICgyODAyKSBQb3J0IDUgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjgwMl82X1BJRAkwWDI4NjIJLyogU2VhTElOSys4LzQ4NSAoMjgwMikgUG9ydCA2ICovCi0jZGVmaW5lIFNFQUxFVkVMXzI4MDJfN19QSUQJMFgyODcyCS8qIFNlYUxJTksrOC80ODUgKDI4MDIpIFBvcnQgNyAqLwotI2RlZmluZSBTRUFMRVZFTF8yODAyXzhfUElECTBYMjg4MgkvKiBTZWFMSU5LKzgvNDg1ICgyODAyKSBQb3J0IDggKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjgwM18xX1BJRAkwWDI4MTMJLyogU2VhTElOSys4ICgyODAzKSBQb3J0IDEgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjgwM18yX1BJRAkwWDI4MjMgCS8qIFNlYUxJTksrOCAoMjgwMykgUG9ydCAyICovCi0jZGVmaW5lIFNFQUxFVkVMXzI4MDNfM19QSUQJMFgyODMzIAkvKiBTZWFMSU5LKzggKDI4MDMpIFBvcnQgMyAqLwotI2RlZmluZSBTRUFMRVZFTF8yODAzXzRfUElECTBYMjg0MyAJLyogU2VhTElOSys4ICgyODAzKSBQb3J0IDQgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjgwM181X1BJRAkwWDI4NTMgCS8qIFNlYUxJTksrOCAoMjgwMykgUG9ydCA1ICovCi0jZGVmaW5lIFNFQUxFVkVMXzI4MDNfNl9QSUQJMFgyODYzIAkvKiBTZWFMSU5LKzggKDI4MDMpIFBvcnQgNiAqLwotI2RlZmluZSBTRUFMRVZFTF8yODAzXzdfUElECTBYMjg3MyAJLyogU2VhTElOSys4ICgyODAzKSBQb3J0IDcgKi8KLSNkZWZpbmUgU0VBTEVWRUxfMjgwM184X1BJRAkwWDI4ODMgCS8qIFNlYUxJTksrOCAoMjgwMykgUG9ydCA4ICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsdWVzIGZvciB0d28gS09CSUwgY2hpcGNhcmQgdGVybWluYWxzLgotICovCi0jZGVmaW5lIEtPQklMX1ZJRAkJMHgwZDQ2CS8qIEtPQklMIFZlbmRvciBJRCAqLwotI2RlZmluZSBLT0JJTF9DT05WX0IxX1BJRAkweDIwMjAJLyogS09CSUwgS29udmVydGVyIGZvciBCMSAqLwotI2RlZmluZSBLT0JJTF9DT05WX0tBQU5fUElECTB4MjAyMQkvKiBLT0JJTF9Lb252ZXJ0ZXIgZm9yIEtBQU4gKi8KLQotLyoKLSAqIEljb20gSUQtMSBkaWdpdGFsIHRyYW5zY2VpdmVyCi0gKi8KLQotI2RlZmluZSBJQ09NX0lEMV9WSUQgICAgICAgICAgICAweDBDMjYKLSNkZWZpbmUgSUNPTV9JRDFfUElEICAgICAgICAgICAgMHgwMDA0Ci0KLS8qCi0gKiBBU0suZnIgZGV2aWNlcwotICovCi0jZGVmaW5lIEZURElfQVNLX1JEUjQwMF9QSUQJMHhDOTkxCS8qIEFTSyBSRFIgNDAwIHNlcmllcyBjYXJkIHJlYWRlciAqLwotCi0vKgotICogRlRESSBVU0IgVUFSVCBjaGlwcyB1c2VkIGluIGNvbnN0cnVjdGlvbiBwcm9qZWN0cyBmcm9tIHRoZQotICogRWxla3RvciBFbGVjdHJvbmljcyBtYWdhemluZSAoaHR0cDovL2VsZWt0b3ItZWxlY3Ryb25pY3MuY28udWspCi0gKi8KLSNkZWZpbmUgRUxFS1RPUl9WSUQJCTB4MEM3RAotI2RlZmluZSBFTEVLVE9SX0ZUMzIzUl9QSUQJMHgwMDA1CS8qIFJGSUQtUmVhZGVyLCBpc3N1ZSAwOS0yMDA2ICovCi0KLS8qCi0gKiBEU1MtMjAgU3luYyBTdGF0aW9uIGZvciBTb255IEVyaWNzc29uIFA4MDAKLSAqLwotI2RlZmluZSBGVERJX0RTUzIwX1BJRCAgICAgICAgICAweEZDODIKLQotLyoKLSAqIEhvbWUgRWxlY3Ryb25pY3MgKHd3dy5ob21lLWVsZWN0cm8uY29tKSBVU0IgZ2FkZ2V0cwotICovCi0jZGVmaW5lIEZURElfSEVfVElSQTFfUElECTB4RkE3OAkvKiBUaXJhLTEgSVIgdHJhbnNjZWl2ZXIgKi8KLQotLyogVVNCLVVJUlQgLSBBbiBpbmZyYXJlZCByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgdXNpbmcgdGhlIDhVMjMyQU0gY2hpcCAqLwotLyogaHR0cDovL2hvbWUuZWFydGhsaW5rLm5ldC9+anJoZWVzL1VTQlVJUlQvaW5kZXguaHRtICovCi0jZGVmaW5lIEZURElfVVNCX1VJUlRfUElECTB4Rjg1MAkvKiBQcm9kdWN0IElkICovCi0KLS8qIFROQy1YIFVTQi10by1wYWNrZXQtcmFkaW8gYWRhcHRlciwgdmVyc2lvbnMgcHJpb3IgdG8gMy4wIChETFAgbW9kdWxlKSAqLwotCi0jZGVmaW5lIEZURElfVE5DX1hfUElECQkweEVCRTAKLQotLyoKLSAqIEVMViBVU0IgZGV2aWNlcyBzdWJtaXR0ZWQgYnkgQ2hyaXN0aWFuIEFidCBvZiBFTFYgKHd3dy5lbHYuZGUpLgotICogQWxsIG9mIHRoZXNlIGRldmljZXMgdXNlIEZUREkncyB2ZW5kb3IgSUQgKDB4MDQwMykuCi0gKgotICogVGhlIHByZXZpb3VzbHkgaW5jbHVkZWQgUElEIGZvciB0aGUgVU8gMTAwIG1vZHVsZSB3YXMgaW5jb3JyZWN0LgotICogSW4gZmFjdCwgdGhhdCBQSUQgd2FzIGZvciBFTFYncyBVUiAxMDAgVVNCLVJTMjMyIGNvbnZlcnRlciAoMHhGQjU4KS4KLSAqCi0gKiBBcm1pbiBMYWV1Z2VyIG9yaWdpbmFsbHkgc2VudCB0aGUgUElEIGZvciB0aGUgVU0gMTAwIG1vZHVsZS4KLSAqLwotI2RlZmluZSBGVERJX1IyMDAwS1VfVFJVRV9STkcJMHhGQjgwICAvKiBSMjAwMEtVIFRSVUUgUk5HICovCi0jZGVmaW5lIEZURElfRUxWX1VSMTAwX1BJRAkweEZCNTgJLyogVVNCLVJTMjMyLVVtc2V0emVyIChVUiAxMDApICovCi0jZGVmaW5lIEZURElfRUxWX1VNMTAwX1BJRAkweEZCNUEJLyogVVNCLU1vZHVsIFVNIDEwMCAqLwotI2RlZmluZSBGVERJX0VMVl9VTzEwMF9QSUQJMHhGQjVCCS8qIFVTQi1Nb2R1bCBVTyAxMDAgKi8KLSNkZWZpbmUgRlRESV9FTFZfQUxDODUwMF9QSUQJMHhGMDZFCS8qIEFMQyA4NTAwIEV4cGVydCAqLwotLyogQWRkaXRpb25hbCBFTFYgUElEcyB0aGF0IGRlZmF1bHQgdG8gdXNpbmcgdGhlIEZUREkgRDJYWCBkcml2ZXJzIG9uCi0gKiBNUyBXaW5kb3dzLCByYXRoZXIgdGhhbiB0aGUgRlRESSBWaXJ0dWFsIENvbSBQb3J0IGRyaXZlcnMuCi0gKiBNYXliZSB0aGVzZSB3aWxsIGJlIGVhc2llciB0byB1c2Ugd2l0aCB0aGUgbGliZnRkaS9saWJ1c2IgdXNlci1zcGFjZQotICogZHJpdmVycywgb3IgcG9zc2libHkgdGhlIENvbWVkaSBkcml2ZXJzIGluIHNvbWUgY2FzZXMuICovCi0jZGVmaW5lIEZURElfRUxWX0NMSTcwMDBfUElECTB4RkI1OQkvKiBDb21wdXRlci1MaWdodC1JbnRlcmZhY2UgKENMSSA3MDAwKSAqLwotI2RlZmluZSBGVERJX0VMVl9QUFM3MzMwX1BJRAkweEZCNUMJLyogUHJvY2Vzc29yLVBvd2VyLVN1cHBseSAoUFBTIDczMzApICovCi0jZGVmaW5lIEZURElfRUxWX1RGTTEwMF9QSUQJMHhGQjVECS8qIFRlbXBlcmFydHVyLUZldWNodGUgTWVzc2dlcmFldCAoVEZNIDEwMCkgKi8KLSNkZWZpbmUgRlRESV9FTFZfVURGNzdfUElECTB4RkI1RQkvKiBVU0IgRENGIEZ1bmt1cmggKFVERiA3NykgKi8KLSNkZWZpbmUgRlRESV9FTFZfVUlPODhfUElECTB4RkI1RgkvKiBVU0ItSS9PIEludGVyZmFjZSAoVUlPIDg4KSAqLwotI2RlZmluZSBGVERJX0VMVl9VQUQ4X1BJRAkweEYwNjgJLyogVVNCLUFELVdhbmRsZXIgKFVBRCA4KSAqLwotI2RlZmluZSBGVERJX0VMVl9VREE3X1BJRAkweEYwNjkJLyogVVNCLURBLVdhbmRsZXIgKFVEQSA3KSAqLwotI2RlZmluZSBGVERJX0VMVl9VU0kyX1BJRAkweEYwNkEJLyogVVNCLVNjaHJpdHRtb3RvcmVuLUludGVyZmFjZSAoVVNJIDIpICovCi0jZGVmaW5lIEZURElfRUxWX1QxMTAwX1BJRAkweEYwNkIJLyogVGhlcm1vbWV0ZXIgKFQgMTEwMCkgKi8KLSNkZWZpbmUgRlRESV9FTFZfUENEMjAwX1BJRAkweEYwNkMJLyogUEMtRGF0ZW5sb2dnZXIgKFBDRCAyMDApICovCi0jZGVmaW5lIEZURElfRUxWX1VMQTIwMF9QSUQJMHhGMDZECS8qIFVTQi1MQ0QtQW5zdGV1ZXJ1bmcgKFVMQSAyMDApICovCi0jZGVmaW5lIEZURElfRUxWX0ZIWjEwMDBQQ19QSUQJMHhGMDZGCS8qIEZIWiAxMDAwIFBDICovCi0jZGVmaW5lIEZURElfRUxWX0NTSThfUElECTB4RTBGMAkvKiBDb21wdXRlci1TY2hhbHQtSW50ZXJmYWNlIChDU0kgOCkgKi8KLSNkZWZpbmUgRlRESV9FTFZfRU0xMDAwRExfUElECTB4RTBGMQkvKiBQQy1EYXRlbmxvZ2dlciBmdWVyIEVuZXJnaWVtb25pdG9yIChFTSAxMDAwIERMKSAqLwotI2RlZmluZSBGVERJX0VMVl9QQ0sxMDBfUElECTB4RTBGMgkvKiBQQy1LYWJlbHRlc3RlciAoUENLIDEwMCkgKi8KLSNkZWZpbmUgRlRESV9FTFZfUkZQNTAwX1BJRAkweEUwRjMJLyogSEYtTGVpc3R1bmdzbWVzc2VyIChSRlAgNTAwKSAqLwotI2RlZmluZSBGVERJX0VMVl9GUzIwU0lHX1BJRAkweEUwRjQJLyogU2lnbmFsZ2ViZXIgKEZTIDIwIFNJRykgKi8KLSNkZWZpbmUgRlRESV9FTFZfV1MzMDBQQ19QSUQJMHhFMEY2CS8qIFBDLVdldHRlcnN0YXRpb24gKFdTIDMwMCBQQykgKi8KLSNkZWZpbmUgRlRESV9FTFZfRkhaMTMwMFBDX1BJRAkweEUwRTgJLyogRkhaIDEzMDAgUEMgKi8KLSNkZWZpbmUgRlRESV9FTFZfV1M1MDBfUElECTB4RTBFOQkvKiBQQy1XZXR0ZXJzdGF0aW9uIChXUyA1MDApICovCi0jZGVmaW5lIEZURElfRUxWX0hTNDg1X1BJRAkweEUwRUEJLyogVVNCIHRvIFJTLTQ4NSBhZGFwdGVyICovCi0jZGVmaW5lIEZURElfRUxWX0VNMTAxMFBDX1BJRAkweEUwRUYJLyogRW5nZXJ5IG1vbml0b3IgRU0gMTAxMCBQQyAqLwotI2RlZmluZSBGVERJX1BISV9GSVNDT19QSUQgICAgICAweEU0MEIgIC8qIFBISSBGaXNjbyBVU0IgdG8gU2VyaWFsIGNhYmxlICovCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgSUQgVEVDSCAod3d3LmlkdC1uZXQuY29tKSBkZXZpY2VzCi0gKi8KLSNkZWZpbmUgSURURUNIX1ZJRAkJMHgwQUNECS8qIElEIFRFQ0ggVmVuZG9yIElEICovCi0jZGVmaW5lIElEVEVDSF9JRFQxMjIxVV9QSUQJMHgwMzAwCS8qIElEVDEyMjFVIFVTQiB0byBSUy0yMzIgYWRhcHRlciAqLwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIE9tbmlkaXJlY3Rpb25hbCBDb250cm9sIFRlY2hub2xvZ3ksIEluYy4gZGV2aWNlcwotICovCi0jZGVmaW5lIE9DVF9WSUQJCQkweDBCMzkJLyogT0NUIHZlbmRvciBJRCAqLwotLyogTm90ZTogT0NUIFVTMTAxIGlzIGFsc28gcmViYWRnZWQgYXMgRGljayBTbWl0aCBFbGVjdHJvbmljcyAoTlopIFhINjM4MSAqLwotLyogQWxzbyByZWJhZGdlZCBhcyBEaWNrIFNtaXRoIEVsZWN0cm9uaWNzIChBdXMpIFhINjQ1MSAqLwotLyogQWxzbyByZWJhZGdlZCBhcyBTSUlHIEluYy4gbW9kZWwgVVMyMzA4IGhhcmR3YXJlIHZlcnNpb24gMSAqLwotI2RlZmluZSBPQ1RfVVMxMDFfUElECQkweDA0MjEJLyogT0NUIFVTMTAxIFVTQiB0byBSUy0yMzIgKi8KLQotLyogYW4gaW5mcmFyZWQgcmVjZWl2ZXIgZm9yIHVzZXIgYWNjZXNzIGNvbnRyb2wgd2l0aCBJUiB0YWdzICovCi0jZGVmaW5lIEZURElfUElFR1JPVVBfUElECTB4RjIwOAkvKiBQcm9kdWN0IElkICovCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgQXJ0ZW1pcyBhc3Ryb25vbWljYWwgVVNCIGJhc2VkIGNhbWVyYXMKLSAqIENoZWNrIGl0IGF0IGh0dHA6Ly93d3cuYXJ0ZW1pc2NjZC5jby51ay8KLSAqLwotI2RlZmluZSBGVERJX0FSVEVNSVNfUElECTB4REYyOAkvKiBBbGwgQXJ0ZW1pcyBDYW1lcmFzICovCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgQVRJSyBJbnN0cnVtZW50cyBhc3Ryb25vbWljYWwgVVNCIGJhc2VkIGNhbWVyYXMKLSAqIENoZWNrIGl0IGF0IGh0dHA6Ly93d3cuYXRpay1pbnN0cnVtZW50cy5jb20vCi0gKi8KLSNkZWZpbmUgRlRESV9BVElLX0FUSzE2X1BJRAkweERGMzAJLyogQVRJSyBBVEstMTYgR3JheXNjYWxlIENhbWVyYSAqLwotI2RlZmluZSBGVERJX0FUSUtfQVRLMTZDX1BJRAkweERGMzIJLyogQVRJSyBBVEstMTZDIENvbG91ciBDYW1lcmEgKi8KLSNkZWZpbmUgRlRESV9BVElLX0FUSzE2SFJfUElECTB4REYzMQkvKiBBVElLIEFUSy0xNkhSIEdyYXlzY2FsZSBDYW1lcmEgKi8KLSNkZWZpbmUgRlRESV9BVElLX0FUSzE2SFJDX1BJRAkweERGMzMJLyogQVRJSyBBVEstMTZIUkMgQ29sb3VyIENhbWVyYSAqLwotI2RlZmluZSBGVERJX0FUSUtfQVRLMTZJQ19QSUQgICAweERGMzUgIC8qIEFUSUsgQVRLLTE2SUMgR3JheXNjYWxlIENhbWVyYSAqLwotCi0vKgotICogUHJvdGVnbyBwcm9kdWN0IGlkcwotICovCi0jZGVmaW5lIFBST1RFR09fU1BFQ0lBTF8xCTB4RkM3MAkvKiBzcGVjaWFsL3Vua25vd24gZGV2aWNlICovCi0jZGVmaW5lIFBST1RFR09fUjJYMAkJMHhGQzcxCS8qIFIyMDAtVVNCIFRSTkcgdW5pdCAoUjIxMCwgUjIyMCwgYW5kIFIyMzApICovCi0jZGVmaW5lIFBST1RFR09fU1BFQ0lBTF8zCTB4RkM3MgkvKiBzcGVjaWFsL3Vua25vd24gZGV2aWNlICovCi0jZGVmaW5lIFBST1RFR09fU1BFQ0lBTF80CTB4RkM3MwkvKiBzcGVjaWFsL3Vua25vd24gZGV2aWNlICovCi0KLS8qCi0gKiBHdWRlIEFuYWxvZy0gdW5kIERpZ2l0YWxzeXN0ZW1lIEdtYkgKLSAqLwotI2RlZmluZSBGVERJX0dVREVBRFNfRTgwOF9QSUQgICAgMHhFODA4Ci0jZGVmaW5lIEZURElfR1VERUFEU19FODA5X1BJRCAgICAweEU4MDkKLSNkZWZpbmUgRlRESV9HVURFQURTX0U4MEFfUElEICAgIDB4RTgwQQotI2RlZmluZSBGVERJX0dVREVBRFNfRTgwQl9QSUQgICAgMHhFODBCCi0jZGVmaW5lIEZURElfR1VERUFEU19FODBDX1BJRCAgICAweEU4MEMKLSNkZWZpbmUgRlRESV9HVURFQURTX0U4MERfUElEICAgIDB4RTgwRAotI2RlZmluZSBGVERJX0dVREVBRFNfRTgwRV9QSUQgICAgMHhFODBFCi0jZGVmaW5lIEZURElfR1VERUFEU19FODBGX1BJRCAgICAweEU4MEYKLSNkZWZpbmUgRlRESV9HVURFQURTX0U4ODhfUElEICAgIDB4RTg4OCAgLyogRXhwZXJ0IElTRE4gQ29udHJvbCBVU0IgKi8KLSNkZWZpbmUgRlRESV9HVURFQURTX0U4ODlfUElEICAgIDB4RTg4OSAgLyogVVNCIFJTLTIzMiBPcHRvQnJpZGdlICovCi0jZGVmaW5lIEZURElfR1VERUFEU19FODhBX1BJRCAgICAweEU4OEEKLSNkZWZpbmUgRlRESV9HVURFQURTX0U4OEJfUElEICAgIDB4RTg4QgotI2RlZmluZSBGVERJX0dVREVBRFNfRTg4Q19QSUQgICAgMHhFODhDCi0jZGVmaW5lIEZURElfR1VERUFEU19FODhEX1BJRCAgICAweEU4OEQKLSNkZWZpbmUgRlRESV9HVURFQURTX0U4OEVfUElEICAgIDB4RTg4RQotI2RlZmluZSBGVERJX0dVREVBRFNfRTg4Rl9QSUQgICAgMHhFODhGCi0KLS8qCi0gKiBMaW54IFRlY2hub2xvZ2llcyBwcm9kdWN0IGlkcwotICovCi0jZGVmaW5lIExJTlhfU0RNVVNCUVNTX1BJRAkweEY0NDgJLyogTGlueCBTRE0tVVNCLVFTLVMgKi8KLSNkZWZpbmUgTElOWF9NQVNURVJERVZFTDJfUElEICAgMHhGNDQ5ICAgLyogTGlueCBNYXN0ZXIgRGV2ZWxvcG1lbnQgMi4wICovCi0jZGVmaW5lIExJTlhfRlVUVVJFXzBfUElEICAgMHhGNDRBICAgLyogTGlueCBmdXR1cmUgZGV2aWNlICovCi0jZGVmaW5lIExJTlhfRlVUVVJFXzFfUElEICAgMHhGNDRCICAgLyogTGlueCBmdXR1cmUgZGV2aWNlICovCi0jZGVmaW5lIExJTlhfRlVUVVJFXzJfUElEICAgMHhGNDRDICAgLyogTGlueCBmdXR1cmUgZGV2aWNlICovCi0KLS8qIENDUyBJbmMuIElDRFUvSUNEVTQwIHByb2R1Y3QgSUQgLSB0aGUgRlQyMzJCTSBpcyB1c2VkIGluIGFuIGluLWNpcmN1aXQtZGVidWdnZXIgKi8KLS8qIHVuaXQgZm9yIFBJQzE2J3MvUElDMTgncyAqLwotI2RlZmluZSBGVERJX0NDU0lDRFUyMF8wX1BJRCAgICAweEY5RDAKLSNkZWZpbmUgRlRESV9DQ1NJQ0RVNDBfMV9QSUQgICAgMHhGOUQxCi0jZGVmaW5lIEZURElfQ0NTTUFDSFhfMl9QSUQgICAgIDB4RjlEMgotI2RlZmluZSBGVERJX0NDU0xPQURfTl9HT18zX1BJRCAweEY5RDMKLSNkZWZpbmUgRlRESV9DQ1NJQ0RVNjRfNF9QSUQgICAgMHhGOUQ0Ci0jZGVmaW5lIEZURElfQ0NTUFJJTUU4XzVfUElEICAgIDB4RjlENQotCi0vKiBJbnNpZGUgQWNjZXNzbyBjb250YWN0bGVzcyByZWFkZXIgKGh0dHA6Ly93d3cuaW5zaWRlZnIuY29tKSAqLwotI2RlZmluZSBJTlNJREVfQUNDRVNTTwkJMHhGQUQwCi0KLS8qCi0gKiBJbnRyZXBpZCBDb250cm9sIFN5c3RlbXMgKGh0dHA6Ly93d3cuaW50cmVwaWRjcy5jb20vKSBWYWx1ZUNBTiBhbmQgTmVvVkkKLSAqLwotI2RlZmluZSBJTlRSRVBJRF9WSUQJCTB4MDkzQwotI2RlZmluZSBJTlRSRVBJRF9WQUxVRUNBTl9QSUQJMHgwNjAxCi0jZGVmaW5lIElOVFJFUElEX05FT1ZJX1BJRAkweDA3MDEKLQotLyoKLSAqIEZhbGNvbSBXaXJlbGVzcyBDb21tdW5pY2F0aW9ucyBHbWJICi0gKi8KLSNkZWZpbmUgRkFMQ09NX1ZJRAkJMHgwRjk0CS8qIFZlbmRvciBJZCAqLwotI2RlZmluZSBGQUxDT01fVFdJU1RfUElECTB4MDAwMQkvKiBGYWxjb20gVHdpc3QgVVNCIEdQUlMgbW9kZW0gKi8KLSNkZWZpbmUgRkFMQ09NX1NBTUJBX1BJRAkweDAwMDUJLyogRmFsY29tIFNhbWJhIFVTQiBHUFJTIG1vZGVtICovCi0KLS8qCi0gKiBTVVVOVE8gcHJvZHVjdCBpZHMKLSAqLwotI2RlZmluZSBGVERJX1NVVU5UT19TUE9SVFNfUElECTB4RjY4MAkvKiBTdXVudG8gU3BvcnRzIGluc3RydW1lbnQgKi8KLQotLyoKLSAqIE9jZWFuaWMgcHJvZHVjdCBpZHMKLSAqLwotI2RlZmluZSBGVERJX09DRUFOSUNfUElECTB4RjQ2MCAgLyogT2NlYW5pYyBkaXZlIGluc3RydW1lbnQgKi8KLQotLyoKLSAqIFRUaSAoVGh1cmxieSBUaGFuZGFyIEluc3RydW1lbnRzKQotICovCi0jZGVmaW5lIFRUSV9WSUQJCQkweDEwM0UJLyogVmVuZG9yIElkICovCi0jZGVmaW5lIFRUSV9RTDM1NVBfUElECQkweDAzRTgJLyogVFRpIFFMMzU1UCBwb3dlciBzdXBwbHkgKi8KLQotLyoKLSAqIERlZmluaXRpb25zIGZvciBCJkIgRWxlY3Ryb25pY3MgcHJvZHVjdHMuCi0gKi8KLSNkZWZpbmUgQkFOREJfVklECQkweDA4NTYJLyogQiZCIEVsZWN0cm9uaWNzIFZlbmRvciBJRCAqLwotI2RlZmluZSBCQU5EQl9VU09UTDRfUElECTB4QUMwMQkvKiBVU09UTDQgSXNvbGF0ZWQgUlMtNDg1IENvbnZlcnRlciAqLwotI2RlZmluZSBCQU5EQl9VU1RMNF9QSUQJCTB4QUMwMgkvKiBVU1RMNCBSUy00ODUgQ29udmVydGVyICovCi0jZGVmaW5lIEJBTkRCX1VTTzlNTDJfUElECTB4QUMwMwkvKiBVU085TUwyIElzb2xhdGVkIFJTLTIzMiBDb252ZXJ0ZXIgKi8KLSNkZWZpbmUgQkFOREJfVVNPUFRMNF9QSUQJMHhBQzExCi0jZGVmaW5lIEJBTkRCX1VTUFRMNF9QSUQJMHhBQzEyCi0jZGVmaW5lIEJBTkRCX1VTTzlNTDJEUl8yX1BJRAkweEFDMTYKLSNkZWZpbmUgQkFOREJfVVNPOU1MMkRSX1BJRAkweEFDMTcKLSNkZWZpbmUgQkFOREJfVVNPUFRMNERSMl9QSUQJMHhBQzE4CS8qIFVTT1BUTDRSLTIgMi1wb3J0IElzb2xhdGVkIFJTLTIzMiBDb252ZXJ0ZXIgKi8KLSNkZWZpbmUgQkFOREJfVVNPUFRMNERSX1BJRAkweEFDMTkKLSNkZWZpbmUgQkFOREJfNDg1VVNCOUZfMldfUElECTB4QUMyNQotI2RlZmluZSBCQU5EQl80ODVVU0I5Rl80V19QSUQJMHhBQzI2Ci0jZGVmaW5lIEJBTkRCXzIzMlVTQjlNX1BJRAkweEFDMjcKLSNkZWZpbmUgQkFOREJfNDg1VVNCVEJfMldfUElECTB4QUMzMwotI2RlZmluZSBCQU5EQl80ODVVU0JUQl80V19QSUQJMHhBQzM0Ci0jZGVmaW5lIEJBTkRCX1RUTDVVU0I5TV9QSUQJMHhBQzQ5Ci0jZGVmaW5lIEJBTkRCX1RUTDNVU0I5TV9QSUQJMHhBQzUwCi0jZGVmaW5lIEJBTkRCX1paX1BST0cxX1VTQl9QSUQJMHhCQTAyCi0KLS8qCi0gKiBSTSBNaWNoYWVsaWRlcyBDQU52aWV3IFVTQiAoaHR0cDovL3d3dy5ybWNhbi5jb20pCi0gKiBDQU4gZmllbGRidXMgaW50ZXJmYWNlIGFkYXB0ZXIsIGFkZGVkIGJ5IHBvcnQgR21iSCB3d3cucG9ydC5kZSkKLSAqIElhbiBBYmJvdHQgY2hhbmdlZCB0aGUgbWFjcm8gbmFtZXMgZm9yIGNvbnNpc3RlbmN5LgotICovCi0jZGVmaW5lIEZURElfUk1fQ0FOVklFV19QSUQJMHhmZDYwCS8qIFByb2R1Y3QgSWQgKi8KLQotLyoKLSAqIEVWRVIgRWNvIFBybyBVUFMgKGh0dHA6Ly93d3cuZXZlci5jb20ucGwvKQotICovCi0KLSNkZWZpbmUJRVZFUl9FQ09fUFJPX0NEUwkweGU1MjAJLyogUlMtMjMyIGNvbnZlcnRlciAqLwotCi0vKgotICogNE4tR0FMQVhZLkRFIFBJRHMgZm9yIENBTi1VU0IsIFVTQi1SUzIzMiwgVVNCLVJTNDIyLCBVU0ItUlM0ODUsCi0gKiBVU0ItVFRZIGFjdGl2LCBVU0ItVFRZIHBhc3Npdi4gIFNvbWUgUElEcyBhcmUgdXNlZCBieSBzZXZlcmFsIGRldmljZXMKLSAqIGFuZCBJJ20gbm90IGVudGlyZWx5IHN1cmUgd2hpY2ggYXJlIHVzZWQgYnkgd2hpY2guCi0gKi8KLSNkZWZpbmUgRlRESV80Tl9HQUxBWFlfREVfMV9QSUQJMHhGM0MwCi0jZGVmaW5lIEZURElfNE5fR0FMQVhZX0RFXzJfUElECTB4RjNDMQotCi0vKgotICogTW9iaWxpdHkgRWxlY3Ryb25pY3MgcHJvZHVjdHMuCi0gKi8KLSNkZWZpbmUgTU9CSUxJVFlfVklECQkJMHgxMzQyCi0jZGVmaW5lIE1PQklMSVRZX1VTQl9TRVJJQUxfUElECQkweDAyMDIJLyogRWFzaURvY2sgVVNCIDIwMCBzZXJpYWwgKi8KLQotLyoKLSAqIG1pY3JvSEFNIHByb2R1Y3QgSURzIChodHRwOi8vd3d3Lm1pY3JvaGFtLmNvbSkuCi0gKiBTdWJtaXR0ZWQgYnkgSnVzdGluIEJ1cmtldCAoS0wxUkwpIDx6b3J0b25AanRhbi5jb20+Ci0gKiBhbmQgTWlrZSBTdHVkZXIgKEs2RUVQKSA8azZlZXBAaGFtc29mdHdhcmUub3JnPi4KLSAqIElhbiBBYmJvdHQgPGFiYm90dGlAbWV2LmNvLnVrPiBhZGRlZCBhIGZldyBtb3JlIGZyb20gdGhlIGRyaXZlciBJTkYgZmlsZS4KLSAqLwotI2RlZmluZSBGVERJX01IQU1fS1dfUElEIDB4RUVFOAkJLyogVVNCLUtXIGludGVyZmFjZSAqLwotI2RlZmluZSBGVERJX01IQU1fWVNfUElEIDB4RUVFOQkJLyogVVNCLVlTIGludGVyZmFjZSAqLwotI2RlZmluZSBGVERJX01IQU1fWTZfUElEIDB4RUVFQQkJLyogVVNCLVk2IGludGVyZmFjZSAqLwotI2RlZmluZSBGVERJX01IQU1fWThfUElEIDB4RUVFQgkJLyogVVNCLVk4IGludGVyZmFjZSAqLwotI2RlZmluZSBGVERJX01IQU1fSUNfUElEIDB4RUVFQwkJLyogVVNCLUlDIGludGVyZmFjZSAqLwotI2RlZmluZSBGVERJX01IQU1fREI5X1BJRCAweEVFRUQJLyogVVNCLURCOSBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgRlRESV9NSEFNX1JTMjMyX1BJRCAweEVFRUUJLyogVVNCLVJTMjMyIGludGVyZmFjZSAqLwotI2RlZmluZSBGVERJX01IQU1fWTlfUElEIDB4RUVFRgkJLyogVVNCLVk5IGludGVyZmFjZSAqLwotCi0vKgotICogQWN0aXZlIFJvYm90cyBwcm9kdWN0IGlkcy4KLSAqLwotI2RlZmluZSBGVERJX0FDVElWRV9ST0JPVFNfUElECTB4RTU0OAkvKiBVU0IgY29tbXMgYm9hcmQgKi8KLQotLyoKLSAqIFhzZW5zIFRlY2hub2xvZ2llcyBCViBwcm9kdWN0cyAoaHR0cDovL3d3dy54c2Vucy5jb20pLgotICovCi0jZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl8wX1BJRAkweEQzODgKLSNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzFfUElECTB4RDM4OQotI2RlZmluZSBYU0VOU19DT05WRVJURVJfMl9QSUQJMHhEMzhBCi0jZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl8zX1BJRAkweEQzOEIKLSNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzRfUElECTB4RDM4QwotI2RlZmluZSBYU0VOU19DT05WRVJURVJfNV9QSUQJMHhEMzhECi0jZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl82X1BJRAkweEQzOEUKLSNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzdfUElECTB4RDM4RgotCi0vKgotICogVGVyYXRyb25payBwcm9kdWN0IGlkcy4KLSAqIFN1Ym1pdHRlZCBieSBPLiBXw7ZsZmVsc2NobmVpZGVyLgotICovCi0jZGVmaW5lIEZURElfVEVSQVRST05JS19WQ1BfUElECSAweEVDODgJLyogVGVyYXRyb25payBkZXZpY2UgKHByZWZlcnJpbmcgVkNQIGRyaXZlciBvbiB3aW5kb3dzKSAqLwotI2RlZmluZSBGVERJX1RFUkFUUk9OSUtfRDJYWF9QSUQgMHhFQzg5CS8qIFRlcmF0cm9uaWsgZGV2aWNlIChwcmVmZXJyaW5nIEQyWFggZHJpdmVyIG9uIHdpbmRvd3MpICovCi0KLS8qCi0gKiBFdm9sdXRpb24gUm9ib3RpY3MgcHJvZHVjdHMgKGh0dHA6Ly93d3cuZXZvbHV0aW9uLmNvbS8pLgotICogU3VibWl0dGVkIGJ5IFNoYXduIE0uIExhdmVsbGUuCi0gKi8KLSNkZWZpbmUgRVZPTFVUSU9OX1ZJRAkJMHhERUVFCS8qIFZlbmRvciBJRCAqLwotI2RlZmluZSBFVk9MVVRJT05fRVIxX1BJRAkweDAzMDAJLyogRVIxIENvbnRyb2wgTW9kdWxlICovCi0jZGVmaW5lIEVWT184VTIzMkFNX1BJRAkweDAyRkYJLyogRXZvbHV0aW9uIHJvYm90aWNzIFJDTTIgKEZUMjMyQU0pKi8KLSNkZWZpbmUgRVZPX0hZQlJJRF9QSUQJCTB4MDMwMgkvKiBFdm9sdXRpb24gcm9ib3RpY3MgUkNNNCBQSUQgKEZUMjMyQk0pKi8KLSNkZWZpbmUgRVZPX1JDTTRfUElECQkweDAzMDMJLyogRXZvbHV0aW9uIHJvYm90aWNzIFJDTTQgUElEICovCi0KLS8qIFB5cmFtaWQgQ29tcHV0ZXIgR21iSCAqLwotI2RlZmluZSBGVERJX1BZUkFNSURfUElECTB4RTZDOAkvKiBQeXJhbWlkIEFwcGxpYW5jZSBEaXNwbGF5ICovCi0KLS8qCi0gKiBOREkgKHd3dy5uZGlnaXRhbC5jb20pIHByb2R1Y3QgaWRzCi0gKi8KLSNkZWZpbmUgRlRESV9ORElfSFVDX1BJRAkJMHhEQTcwCS8qIE5ESSBIb3N0IFVTQiBDb252ZXJ0ZXIgKi8KLSNkZWZpbmUgRlRESV9ORElfU1BFQ1RSQV9TQ1VfUElECTB4REE3MQkvKiBOREkgU3BlY3RyYSBTQ1UgKi8KLSNkZWZpbmUgRlRESV9ORElfRlVUVVJFXzJfUElECQkweERBNzIJLyogTkRJIGZ1dHVyZSBkZXZpY2UgIzIgKi8KLSNkZWZpbmUgRlRESV9ORElfRlVUVVJFXzNfUElECQkweERBNzMJLyogTkRJIGZ1dHVyZSBkZXZpY2UgIzMgKi8KLSNkZWZpbmUgRlRESV9ORElfQVVST1JBX1NDVV9QSUQJCTB4REE3NAkvKiBOREkgQXVyb3JhIFNDVSAqLwotCi0vKgotICogUG9zaWZsZXggaW5jIHJldGFpbCBlcXVpcG1lbnQgKGh0dHA6Ly93d3cucG9zaWZsZXguY29tLnR3KQotICovCi0jZGVmaW5lIFBPU0lGTEVYX1ZJRAkJMHgwZDNhICAvKiBWZW5kb3IgSUQgKi8KLSNkZWZpbmUgUE9TSUZMRVhfUFA3MDAwX1BJRAkweDAzMDAgIC8qIFBQLTcwMDBJSSB0aGVybWFsIHByaW50ZXIgKi8KLQotLyoKLSAqIFdlc3RyZXggSW50ZXJuYXRpb25hbCBkZXZpY2VzIHN1Ym1pdHRlZCBieSBDb3J5IExlZQotICovCi0jZGVmaW5lIEZURElfV0VTVFJFWF9NT0RFTF83NzdfUElECTB4REMwMAkvKiBNb2RlbCA3NzcgKi8KLSNkZWZpbmUgRlRESV9XRVNUUkVYX01PREVMXzg5MDBGX1BJRAkweERDMDEJLyogTW9kZWwgODkwMEYgKi8KLQotLyoKLSAqIFJSLUNpcktpdHMgTG9jb0J1ZmZlciBVU0IgKGh0dHA6Ly93d3cucnItY2lya2l0cy5jb20pCi0gKi8KLSNkZWZpbmUgRlRESV9SUkNJUktJVFNfTE9DT0JVRkZFUl9QSUQJMHhjN2QwCS8qIExvY29CdWZmZXIgVVNCICovCi0KLS8qCi0gKiBFY2xvIChodHRwOi8vd3d3LmVjbG8ucHQvKSBwcm9kdWN0IElEcy4KLSAqIFBJRCAweEVBOTAgc3VibWl0dGVkIGJ5IE1hcnRpbiBHcmlsbC4KLSAqLwotI2RlZmluZSBGVERJX0VDTE9fQ09NXzFXSVJFX1BJRAkweEVBOTAJLyogQ09NIHRvIDEtV2lyZSBVU0IgYWRhcHRvciAqLwotCi0vKgotICogUGFwb3VjaCBwcm9kdWN0cyAoaHR0cDovL3d3dy5wYXBvdWNoLmNvbS8pCi0gKiBTdWJtaXR0ZWQgYnkgRm9sa2VydCB2YW4gSGV1c2RlbgotICovCi0KLSNkZWZpbmUgUEFQT1VDSF9WSUQJCQkweDUwNTAJLyogVmVuZG9yIElEICovCi0jZGVmaW5lIFBBUE9VQ0hfVE1VX1BJRAkJCTB4MDQwMAkvKiBUTVUgVVNCIFRoZXJtb21ldGVyICovCi0jZGVmaW5lIFBBUE9VQ0hfUVVJRE80eDRfUElECQkweDA5MDAJLyogUXVpZG8gNC80IE1vZHVsZSAqLwotCi0vKgotICogQUNHIElkZW50aWZpY2F0aW9uIFRlY2hub2xvZ2llcyBHbWJIIHByb2R1Y3RzIChodHRwOi8vd3d3LmFjZy5kZS8pLgotICogU3VibWl0dGVkIGJ5IGFudG9uIC1hdC0gZ290bzEwIC1kb3QtIG9yZy4KLSAqLwotI2RlZmluZSBGVERJX0FDR19IRkRVQUxfUElECQkweEREMjAJLyogSEYgRHVhbCBJU08gUmVhZGVyIChSRklEKSAqLwotCi0vKgotICogWW9zdCBFbmdpbmVlcmluZywgSW5jLiBwcm9kdWN0cyAod3d3Lnlvc3RlbmdpbmVlcmluZy5jb20pLgotICogUElEIDB4RTA1MCBzdWJtaXR0ZWQgYnkgQWFyb24gUHJvc2UuCi0gKi8KLSNkZWZpbmUgRlRESV9ZRUlfU0VSVk9DRU5URVIzMV9QSUQJMHhFMDUwCS8qIFlFSSBTZXJ2b0NlbnRlcjMuMSBVU0IgKi8KLQotLyoKLSAqIFRob3JMYWJzIFVTQiBtb3RvciBkcml2ZXJzCi0gKi8KLSNkZWZpbmUgRlRESV9USE9STEFCU19QSUQJCTB4ZmFmMCAvKiBUaG9yTGFicyBVU0IgbW90b3IgZHJpdmVycyAqLwotCi0vKgotICogVGVzdG8gcHJvZHVjdHMgKGh0dHA6Ly93d3cudGVzdG8uY29tLykKLSAqIFN1Ym1pdHRlZCBieSBDb2xpbiBMZXJveQotICovCi0jZGVmaW5lIFRFU1RPX1ZJRAkJCTB4MTI4RAotI2RlZmluZSBURVNUT19VU0JfSU5URVJGQUNFX1BJRAkJMHgwMDAxCi0KLS8qCi0gKiBHYW1tYSBTY291dCAoaHR0cDovL2dhbW1hLXNjb3V0LmNvbS8pLiBTdWJtaXR0ZWQgYnkgcnNjQHJ1bnR1eC5jb20uCi0gKi8KLSNkZWZpbmUgRlRESV9HQU1NQV9TQ09VVF9QSUQJCTB4RDY3OAkvKiBHYW1tYSBTY291dCBvbmxpbmUgKi8KLQotLyoKLSAqIFRhY3RyaXggT3BlblBvcnQgKEVDVSkgZGV2aWNlcy4KLSAqIE9wZW5Qb3J0IDEuM00gc3VibWl0dGVkIGJ5IERvbm91ciBTaXplbW9yZS4KLSAqIE9wZW5Qb3J0IDEuM1MgYW5kIDEuM1Ugc3VibWl0dGVkIGJ5IElhbiBBYmJvdHQuCi0gKi8KLSNkZWZpbmUgRlRESV9UQUNUUklYX09QRU5QT1JUXzEzTV9QSUQJMHhDQzQ4CS8qIE9wZW5Qb3J0IDEuMyBNaXRzdWJpc2hpICovCi0jZGVmaW5lIEZURElfVEFDVFJJWF9PUEVOUE9SVF8xM1NfUElECTB4Q0M0OQkvKiBPcGVuUG9ydCAxLjMgU3ViYXJ1ICovCi0jZGVmaW5lIEZURElfVEFDVFJJWF9PUEVOUE9SVF8xM1VfUElECTB4Q0M0QQkvKiBPcGVuUG9ydCAxLjMgVW5pdmVyc2FsICovCi0KLS8qCi0gKiBUZWxsZHVzIFRlY2hub2xvZ2llcwotICovCi0jZGVmaW5lIFRFTExEVVNfVklECQkJMHgxNzgxCS8qIFZlbmRvciBJRCAqLwotI2RlZmluZSBURUxMRFVTX1RFTExTVElDS19QSUQJCTB4MEMzMAkvKiBSRiBjb250cm9sIGRvbmdsZSA0MzMgTUh6IHVzaW5nIEZUMjMyUkwgKi8KLQotLyoKLSAqIElCUyBlbGVrdHJvbmlrIHByb2R1Y3QgaWRzCi0gKiBTdWJtaXR0ZWQgYnkgVGhvbWFzIFNjaGxldXNlbmVyCi0gKi8KLSNkZWZpbmUgRlRESV9JQlNfVVM0ODVfUElECTB4ZmYzOCAgLyogSUJTIFVTNDg1IChVU0I8LS0+UlM0MjIvNDg1IGludGVyZmFjZSkgKi8KLSNkZWZpbmUgRlRESV9JQlNfUElDUFJPX1BJRAkweGZmMzkgIC8qIElCUyBQSUMtUHJvZ3JhbW1lciAqLwotI2RlZmluZSBGVERJX0lCU19QQ01DSUFfUElECTB4ZmYzYSAgLyogSUJTIENhcmQgcmVhZGVyIGZvciBQQ01DSUEgU1JBTS1jYXJkcyAqLwotI2RlZmluZSBGVERJX0lCU19QSzFfUElECTB4ZmYzYiAgLyogSUJTIFBLMSAtIFBhcnRpY2VsIGNvdW50ZXIgKi8KLSNkZWZpbmUgRlRESV9JQlNfUlMyMzJNT05fUElECTB4ZmYzYyAgLyogSUJTIFJTMjMyIC0gTW9uaXRvciAqLwotI2RlZmluZSBGVERJX0lCU19BUFA3MF9QSUQJMHhmZjNkICAvKiBBUFAgNzAgKGR1c3QgbW9uaXRvcmluZyBzeXN0ZW0pICovCi0jZGVmaW5lIEZURElfSUJTX1BFRE9fUElECTB4ZmYzZSAgLyogSUJTIFBFRE8tTW9kZW0gKFJGIG1vZGVtIDg2OC4zNSBNSHopICovCi0jZGVmaW5lIEZURElfSUJTX1BST0RfUElECTB4ZmYzZiAgLyogZnV0dXJlIGRldmljZSAqLwotCi0vKgotICogIE1heFN0cmVhbSBkZXZpY2VzCXd3dy5tYXhzdHJlYW0ubmV0Ci0gKi8KLSNkZWZpbmUgRlRESV9NQVhTVFJFQU1fUElECTB4RUUxOAkvKiBYYmVlIFBLRy1VIE1vZHVsZSAqLwotCi0vKiBPbGltZXggKi8KLSNkZWZpbmUgT0xJTUVYX1ZJRAkJCTB4MTVCQQotI2RlZmluZSBPTElNRVhfQVJNX1VTQl9PQ0RfUElECQkweDAwMDMKLQotLyogTHVtaW5hcnkgTWljcm8gU3RlbGxhcmlzIEJvYXJkcywgVklEID0gRlRESV9WSUQgKi8KLS8qIEZUREkgMjMzMkMgRHVhbCBjaGFubmVsIGRldmljZSwgc2lkZSBBPTI0NSBGSUZPIChKVEFHKSwgU2lkZSBCPVJTMjMyIFVBUlQgKi8KLSNkZWZpbmUgTE1JX0xNM1NfREVWRUxfQk9BUkRfUElECTB4YmNkOAotI2RlZmluZSBMTUlfTE0zU19FVkFMX0JPQVJEX1BJRAkJMHhiY2Q5Ci0KLS8qIHd3dy5lbHN0ZXJlbGVjdHJpY2l0eS5jb20gRWxzdGVyIFVuaWNvbSBJSUkgT3B0aWNhbCBQcm9iZSAqLwotI2RlZmluZSBGVERJX0VMU1RFUl9VTklDT01fUElECQkweEU3MDAgLyogUHJvZHVjdCBJZCAqLwotCi0vKgotICogVGhlIE1vYmlsaXR5IExhYiAoVE1MKQotICogU3VibWl0dGVkIGJ5IFBpZXJyZSBDYXN0ZWxsYQotICovCi0jZGVmaW5lIFRNTF9WSUQJCQkweDFCOTEJLyogVmVuZG9yIElEICovCi0jZGVmaW5lIFRNTF9VU0JfU0VSSUFMX1BJRAkweDAwNjQJLyogVVNCIC0gU2VyaWFsIENvbnZlcnRlciAqLwotCi0vKiBQcm9wb3ggZGV2aWNlcyAqLwotI2RlZmluZSBGVERJX1BST1BPWF9KVEFHQ0FCTEVJSV9QSUQJMHhENzM4Ci0KLS8qIFJpZyBFeHBlcnQgVWtyYWluZSBkZXZpY2VzICovCi0jZGVmaW5lIEZURElfUkVVX1RJTllfUElECQkweEVEMjIJLyogUmlnRXhwZXJ0IFRpbnkgKi8KLQotLyogRG9taW50ZWxsIHByb2R1Y3RzICBodHRwOi8vd3d3LmRvbWludGVsbC5jb20gKi8KLSNkZWZpbmUgRlRESV9ET01JTlRFTExfREdRR19QSUQJMHhFRjUwCS8qIE1hc3RlciAqLwotI2RlZmluZSBGVERJX0RPTUlOVEVMTF9EVVNCX1BJRAkweEVGNTEJLyogRFVTQjAxIG1vZHVsZSAqLwotCi0vKiBBbHRpLTIgcHJvZHVjdHMgIGh0dHA6Ly93d3cuYWx0aS0yLmNvbSAqLwotI2RlZmluZSBBTFRJMl9WSUQJMHgxQkM5Ci0jZGVmaW5lIEFMVEkyX04zX1BJRAkweDYwMDEJLyogTmVwdHVuZSAzICovCi0KIC8qIENvbW1hbmRzICovCiAjZGVmaW5lIEZURElfU0lPX1JFU0VUIAkJMCAvKiBSZXNldCB0aGUgcG9ydCAqLwogI2RlZmluZSBGVERJX1NJT19NT0RFTV9DVFJMIAkxIC8qIFNldCB0aGUgbW9kZW0gY29udHJvbCByZWdpc3RlciAqLwpAQCAtOTEwLDg2ICs0MCw2IEBACiAjZGVmaW5lIElOVEVSRkFDRV9DCQkzCiAjZGVmaW5lIElOVEVSRkFDRV9ECQk0CiAKLS8qCi0gKiBGSUMgLyBPcGVuTW9rbywgSW5jLiBodHRwOi8vd2lraS5vcGVubW9rby5vcmcvd2lraS9OZW8xOTczX0RlYnVnX0JvYXJkX3YzCi0gKiBTdWJtaXR0ZWQgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG9wZW5tb2tvLm9yZz4KLSAqLwotI2RlZmluZQlGSUNfVklECQkJMHgxNDU3Ci0jZGVmaW5lCUZJQ19ORU8xOTczX0RFQlVHX1BJRAkweDUxMTgKLQotLyoKLSAqIFJBVE9DIFJFWC1VU0I2MEYKLSAqLwotI2RlZmluZSBSQVRPQ19WRU5ET1JfSUQJCTB4MDU4NAotI2RlZmluZSBSQVRPQ19QUk9EVUNUX0lEX1VTQjYwRgkweGIwMjAKLQotLyoKLSAqIERJRUJPTEQgQkNTIFNFOTIzCi0gKi8KLSNkZWZpbmUgRElFQk9MRF9CQ1NfU0U5MjNfUElECTB4ZmI5OQotCi0vKgotICogQXRtZWwgU1RLNTQxCi0gKi8KLSNkZWZpbmUgQVRNRUxfVklECQkweDAzZWIgLyogVmVuZG9yIElEICovCi0jZGVmaW5lIFNUSzU0MV9QSUQJCTB4MjEwOSAvKiBaaWdiZWUgQ29udHJvbGxlciAqLwotCi0vKgotICogRHJlc2RlbiBFbGVrdHJvbmljIFNlbnNvciBUZXJtaW5hbCBCb2FyZAotICovCi0jZGVmaW5lIERFX1ZJRAkJCTB4MWNmMSAvKiBWZW5kb3IgSUQgKi8KLSNkZWZpbmUgU1RCX1BJRAkJCTB4MDAwMSAvKiBTZW5zb3IgVGVybWluYWwgQm9hcmQgKi8KLSNkZWZpbmUgV0hUX1BJRAkJCTB4MDAwNCAvKiBXaXJlbGVzcyBIYW5kaGVsZCBUZXJtaW5hbCAqLwotCi0vKgotICogQmxhY2tmaW4gZ25JQ0UgSlRBRwotICogaHR0cDovL2RvY3MuYmxhY2tmaW4udWNsaW51eC5vcmcvZG9rdS5waHA/aWQ9aHc6anRhZzpnbmljZQotICovCi0jZGVmaW5lIEFESV9WSUQgCQkweDA0NTYKLSNkZWZpbmUgQURJX0dOSUNFX1BJRCAJCTB4RjAwMAotI2RlZmluZSBBRElfR05JQ0VQTFVTX1BJRCAJMHhGMDAxCi0KLS8qCi0gKiBKRVRJIFNQRUNUUk9NRVRFUiBTUEVDQk9TIDEyMDEKLSAqIGh0dHA6Ly93d3cuamV0aS5jb20vcHJvZHVjdHMvc3lzL3NjYi9zY2IxMjAxLnBocAotICovCi0jZGVmaW5lIEpFVElfVklECQkweDBjNmMKLSNkZWZpbmUgSkVUSV9TUEMxMjAxX1BJRAkweDA0YjIKLQotLyoKLSAqIE1hcnZlbGwgU2hlZXZhUGx1ZwotICovCi0jZGVmaW5lIE1BUlZFTExfVklECQkweDllODgKLSNkZWZpbmUgTUFSVkVMTF9TSEVFVkFQTFVHX1BJRAkweDllOGYKLQotI2RlZmluZSBGVERJX1RVUlRFTElaRVJfUElECTB4QkRDOCAvKiBKVEFHL1JTLTIzMiBhZGFwdGVyIGJ5IGVnbml0ZSBHbUJIICovCi0KLS8qCi0gKiBHTiBPdG9tZXRyaWNzIChodHRwOi8vd3d3Lm90b21ldHJpY3MuY29tKQotICogU3VibWl0dGVkIGJ5IFZpbGxlIFN1bmRiZXJnLgotICovCi0jZGVmaW5lIEdOX09UT01FVFJJQ1NfVklECTB4MGMzMwkvKiBWZW5kb3IgSUQgKi8KLSNkZWZpbmUgQVVSSUNBTF9VU0JfUElECQkweDAwMTAJLyogQXVyaWNhbCBVU0IgQXVkaW9tZXRlciAqLwotCi0vKgotICogQmF5ZXIgQXNjZW5zaWEgQ29udG91ciBibG9vZCBnbHVjb3NlIG1ldGVyIFVTQi1jb252ZXJ0ZXIgY2FibGUuCi0gKiBodHRwOi8vd2luZ2x1Y29mYWN0cy5jb20vY2FibGVzLwotICovCi0jZGVmaW5lIEJBWUVSX1ZJRCAgICAgICAgICAgICAgICAgICAgICAweDFBNzkKLSNkZWZpbmUgQkFZRVJfQ09OVE9VUl9DQUJMRV9QSUQgICAgICAgIDB4NjAwMQotCi0vKgotICogTWFydmVsbCBPcGVuUkQgQmFzZSwgQ2xpZW50Ci0gKiBodHRwOi8vd3d3Lm9wZW4tcmQub3JnCi0gKiBPcGVuUkQgQmFzZSwgQ2xpZW50IHVzZSBWSUQgMHgwNDAzCi0gKi8KLSNkZWZpbmUgTUFSVkVMTF9PUEVOUkRfUElECTB4OWU5MAotCi0vKgotICogSGFtZWcgSE84MjAgYW5kIEhPODcwIGludGVyZmFjZSAodXNpbmcgVklEIDB4MDQwMykKLSAqLwotI2RlZmluZSAgICAgICAgSEFNRUdfSE84MjBfUElEICAgICAgICAgMHhlZDc0Ci0jZGVmaW5lICAgICAgICBIQU1FR19ITzg3MF9QSUQgICAgICAgICAweGVkNzEKIAogLyoKICAqICAgQm1SZXF1ZXN0VHlwZTogIDExMDAgMDAwMGIKQEAgLTE1MDQsNCArNTU0LDMgQEAKICAqIEIyLi43CUxlbmd0aCBvZiBtZXNzYWdlIC0gKG5vdCBpbmNsdWRpbmcgQnl0ZSAwKQogICoKICAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5MmI0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaApAQCAtMCwwICsxLDk4NiBAQAorLyoKKyAqIHZlbmRvci9wcm9kdWN0IElEcyAoVklEL1BJRCkgb2YgZGV2aWNlcyB1c2luZyBGVERJIFVTQiBzZXJpYWwgY29udmVydGVycy4KKyAqIFBsZWFzZSBrZWVwIG51bWVyaWNhbGx5IHNvcnRlZCB3aXRoaW4gaW5kaXZpZHVhbCBhcmVhcywgdGhhbmtzIQorICoKKyAqIFBoaWxpcHAgR/xocmluZyAtIHBnQGZ1dHVyZXdhcmUuYXQgLSBhZGRlZCB0aGUgRGV2aWNlIElEIG9mIHRoZSBVU0IgcmVsYWlzCisgKiBmcm9tIFJ1ZG9sZiBHdWdsZXIKKyAqCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiBkZXZpY2VzIHVzaW5nIEZUREkgVklEICoqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBGVERJX1ZJRAkweDA0MDMJLyogVmVuZG9yIElkICovCisKKworLyoqKiAib3JpZ2luYWwiIEZUREkgZGV2aWNlIFBJRHMgKioqLworCisjZGVmaW5lIEZURElfOFUyMzJBTV9QSUQgMHg2MDAxIC8qIFNpbWlsYXIgZGV2aWNlIHRvIFNJTyBhYm92ZSAqLworI2RlZmluZSBGVERJXzhVMjMyQU1fQUxUX1BJRCAweDYwMDYgLyogRlRESSdzIGFsdGVybmF0ZSBQSUQgZm9yIGFib3ZlICovCisjZGVmaW5lIEZURElfOFUyMjMyQ19QSUQgMHg2MDEwIC8qIER1YWwgY2hhbm5lbCBkZXZpY2UgKi8KKyNkZWZpbmUgRlRESV80MjMySF9QSUQgMHg2MDExIC8qIFF1YWQgY2hhbm5lbCBoaS1zcGVlZCBkZXZpY2UgKi8KKyNkZWZpbmUgRlRESV9TSU9fUElECTB4ODM3MgkvKiBQcm9kdWN0IElkIFNJTyBhcHBsaWNhdGlvbiBvZiA4VTEwMEFYICAqLworI2RlZmluZSBGVERJXzIzMlJMX1BJRCAgMHhGQkZBICAvKiBQcm9kdWN0IElEIGZvciBGVDIzMlJMICovCisKKworLyoqKiB0aGlyZC1wYXJ0eSBQSURzICh1c2luZyBGVERJX1ZJRCkgKioqLworCisvKgorICogTWFydmVsbCBPcGVuUkQgQmFzZSwgQ2xpZW50CisgKiBodHRwOi8vd3d3Lm9wZW4tcmQub3JnCisgKiBPcGVuUkQgQmFzZSwgQ2xpZW50IHVzZSBWSUQgMHgwNDAzCisgKi8KKyNkZWZpbmUgTUFSVkVMTF9PUEVOUkRfUElECTB4OWU5MAorCisvKiB3d3cuY2FuZGFwdGVyLmNvbSBFd2VydCBFbmVyZ3kgU3lzdGVtcyBDQU5kYXB0ZXIgZGV2aWNlICovCisjZGVmaW5lIEZURElfQ0FOREFQVEVSX1BJRCAweDlGODAgLyogUHJvZHVjdCBJZCAqLworCisvKiBPT0NEbGluayBieSBKb2VybiBLYWlwZiA8am9lcm5rQHdlYi5kZT4KKyAqIChodHRwOi8vd3d3LmpvZXJub25saW5lLmRlL2R3L2Rva3UucGhwP2lkPXN0YXJ0JmlkeD1wcm9qZWN0czpvb2NkbGluaykgKi8KKyNkZWZpbmUgRlRESV9PT0NETElOS19QSUQJMHhiYWY4CS8qIEFtb250ZWMgSlRBR2tleSAqLworCisvKiBMdW1pbmFyeSBNaWNybyBTdGVsbGFyaXMgQm9hcmRzLCBWSUQgPSBGVERJX1ZJRCAqLworLyogRlRESSAyMzMyQyBEdWFsIGNoYW5uZWwgZGV2aWNlLCBzaWRlIEE9MjQ1IEZJRk8gKEpUQUcpLCBTaWRlIEI9UlMyMzIgVUFSVCAqLworI2RlZmluZSBMTUlfTE0zU19ERVZFTF9CT0FSRF9QSUQJMHhiY2Q4CisjZGVmaW5lIExNSV9MTTNTX0VWQUxfQk9BUkRfUElECQkweGJjZDkKKworI2RlZmluZSBGVERJX1RVUlRFTElaRVJfUElECTB4QkRDOCAvKiBKVEFHL1JTLTIzMiBhZGFwdGVyIGJ5IGVnbml0ZSBHbUJIICovCisKKy8qIE9wZW5EQ0MgKHd3dy5vcGVuZGNjLmRlKSBwcm9kdWN0IGlkICovCisjZGVmaW5lIEZURElfT1BFTkRDQ19QSUQJMHhCRkQ4CisjZGVmaW5lIEZURElfT1BFTkRDQ19TTklGRkVSX1BJRAkweEJGRDkKKyNkZWZpbmUgRlRESV9PUEVORENDX1RIUk9UVExFX1BJRAkweEJGREEKKyNkZWZpbmUgRlRESV9PUEVORENDX0dBVEVXQVlfUElECTB4QkZEQgorCisvKgorICogUlItQ2lyS2l0cyBMb2NvQnVmZmVyIFVTQiAoaHR0cDovL3d3dy5yci1jaXJraXRzLmNvbSkKKyAqLworI2RlZmluZSBGVERJX1JSQ0lSS0lUU19MT0NPQlVGRkVSX1BJRAkweGM3ZDAJLyogTG9jb0J1ZmZlciBVU0IgKi8KKworLyogRE1YNEFMTCBETVggSW50ZXJmYWNlcyAqLworI2RlZmluZSBGVERJX0RNWDRBTEwgMHhDODUwCisKKy8qCisgKiBBU0suZnIgZGV2aWNlcworICovCisjZGVmaW5lIEZURElfQVNLX1JEUjQwMF9QSUQJMHhDOTkxCS8qIEFTSyBSRFIgNDAwIHNlcmllcyBjYXJkIHJlYWRlciAqLworCisvKiB3d3cuc3RhcnRpbmctcG9pbnQtc3lzdGVtcy5jb20gtUNoYW1lbGVvbiBkZXZpY2UgKi8KKyNkZWZpbmUgRlRESV9NSUNST19DSEFNRUxFT05fUElECTB4Q0FBMAkvKiBQcm9kdWN0IElkICovCisKKy8qCisgKiBUYWN0cml4IE9wZW5Qb3J0IChFQ1UpIGRldmljZXMuCisgKiBPcGVuUG9ydCAxLjNNIHN1Ym1pdHRlZCBieSBEb25vdXIgU2l6ZW1vcmUuCisgKiBPcGVuUG9ydCAxLjNTIGFuZCAxLjNVIHN1Ym1pdHRlZCBieSBJYW4gQWJib3R0LgorICovCisjZGVmaW5lIEZURElfVEFDVFJJWF9PUEVOUE9SVF8xM01fUElECTB4Q0M0OAkvKiBPcGVuUG9ydCAxLjMgTWl0c3ViaXNoaSAqLworI2RlZmluZSBGVERJX1RBQ1RSSVhfT1BFTlBPUlRfMTNTX1BJRAkweENDNDkJLyogT3BlblBvcnQgMS4zIFN1YmFydSAqLworI2RlZmluZSBGVERJX1RBQ1RSSVhfT1BFTlBPUlRfMTNVX1BJRAkweENDNEEJLyogT3BlblBvcnQgMS4zIFVuaXZlcnNhbCAqLworCisvKiBTQ1MgSEYgUmFkaW8gTW9kZW1zIFBJRCdzIChodHRwOi8vd3d3LnNjcy1wdGMuY29tKSAqLworLyogdGhlIFZJRCBpcyB0aGUgc3RhbmRhcmQgZnRkaSB2aWQgKEZURElfVklEKSAqLworI2RlZmluZSBGVERJX1NDU19ERVZJQ0VfMF9QSUQgMHhEMDEwICAgIC8qIFNDUyBQVEMtSUl1c2IgKi8KKyNkZWZpbmUgRlRESV9TQ1NfREVWSUNFXzFfUElEIDB4RDAxMSAgICAvKiBTQ1MgVHJhY2tlciAvIERTUCBUTkMgKi8KKyNkZWZpbmUgRlRESV9TQ1NfREVWSUNFXzJfUElEIDB4RDAxMgorI2RlZmluZSBGVERJX1NDU19ERVZJQ0VfM19QSUQgMHhEMDEzCisjZGVmaW5lIEZURElfU0NTX0RFVklDRV80X1BJRCAweEQwMTQKKyNkZWZpbmUgRlRESV9TQ1NfREVWSUNFXzVfUElEIDB4RDAxNQorI2RlZmluZSBGVERJX1NDU19ERVZJQ0VfNl9QSUQgMHhEMDE2CisjZGVmaW5lIEZURElfU0NTX0RFVklDRV83X1BJRCAweEQwMTcKKworLyogaVBsdXMgZGV2aWNlICovCisjZGVmaW5lIEZURElfSVBMVVNfUElEIDB4RDA3MCAvKiBQcm9kdWN0IElkICovCisjZGVmaW5lIEZURElfSVBMVVMyX1BJRCAweEQwNzEgLyogUHJvZHVjdCBJZCAqLworCisvKgorICogR2FtbWEgU2NvdXQgKGh0dHA6Ly9nYW1tYS1zY291dC5jb20vKS4gU3VibWl0dGVkIGJ5IHJzY0BydW50dXguY29tLgorICovCisjZGVmaW5lIEZURElfR0FNTUFfU0NPVVRfUElECQkweEQ2NzgJLyogR2FtbWEgU2NvdXQgb25saW5lICovCisKKy8qIFByb3BveCBkZXZpY2VzICovCisjZGVmaW5lIEZURElfUFJPUE9YX0pUQUdDQUJMRUlJX1BJRAkweEQ3MzgKKworLyoKKyAqIFhzZW5zIFRlY2hub2xvZ2llcyBCViBwcm9kdWN0cyAoaHR0cDovL3d3dy54c2Vucy5jb20pLgorICovCisjZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl8wX1BJRAkweEQzODgKKyNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzFfUElECTB4RDM4OQorI2RlZmluZSBYU0VOU19DT05WRVJURVJfMl9QSUQJMHhEMzhBCisjZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl8zX1BJRAkweEQzOEIKKyNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzRfUElECTB4RDM4QworI2RlZmluZSBYU0VOU19DT05WRVJURVJfNV9QSUQJMHhEMzhECisjZGVmaW5lIFhTRU5TX0NPTlZFUlRFUl82X1BJRAkweEQzOEUKKyNkZWZpbmUgWFNFTlNfQ09OVkVSVEVSXzdfUElECTB4RDM4RgorCisvKgorICogTkRJICh3d3cubmRpZ2l0YWwuY29tKSBwcm9kdWN0IGlkcworICovCisjZGVmaW5lIEZURElfTkRJX0hVQ19QSUQJCTB4REE3MAkvKiBOREkgSG9zdCBVU0IgQ29udmVydGVyICovCisjZGVmaW5lIEZURElfTkRJX1NQRUNUUkFfU0NVX1BJRAkweERBNzEJLyogTkRJIFNwZWN0cmEgU0NVICovCisjZGVmaW5lIEZURElfTkRJX0ZVVFVSRV8yX1BJRAkJMHhEQTcyCS8qIE5ESSBmdXR1cmUgZGV2aWNlICMyICovCisjZGVmaW5lIEZURElfTkRJX0ZVVFVSRV8zX1BJRAkJMHhEQTczCS8qIE5ESSBmdXR1cmUgZGV2aWNlICMzICovCisjZGVmaW5lIEZURElfTkRJX0FVUk9SQV9TQ1VfUElECQkweERBNzQJLyogTkRJIEF1cm9yYSBTQ1UgKi8KKworLyoKKyAqIFdlc3RyZXggSW50ZXJuYXRpb25hbCBkZXZpY2VzIHN1Ym1pdHRlZCBieSBDb3J5IExlZQorICovCisjZGVmaW5lIEZURElfV0VTVFJFWF9NT0RFTF83NzdfUElECTB4REMwMAkvKiBNb2RlbCA3NzcgKi8KKyNkZWZpbmUgRlRESV9XRVNUUkVYX01PREVMXzg5MDBGX1BJRAkweERDMDEJLyogTW9kZWwgODkwMEYgKi8KKworLyoKKyAqIEFDRyBJZGVudGlmaWNhdGlvbiBUZWNobm9sb2dpZXMgR21iSCBwcm9kdWN0cyAoaHR0cDovL3d3dy5hY2cuZGUvKS4KKyAqIFN1Ym1pdHRlZCBieSBhbnRvbiAtYXQtIGdvdG8xMCAtZG90LSBvcmcuCisgKi8KKyNkZWZpbmUgRlRESV9BQ0dfSEZEVUFMX1BJRAkJMHhERDIwCS8qIEhGIER1YWwgSVNPIFJlYWRlciAoUkZJRCkgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBBcnRlbWlzIGFzdHJvbm9taWNhbCBVU0IgYmFzZWQgY2FtZXJhcworICogQ2hlY2sgaXQgYXQgaHR0cDovL3d3dy5hcnRlbWlzY2NkLmNvLnVrLworICovCisjZGVmaW5lIEZURElfQVJURU1JU19QSUQJMHhERjI4CS8qIEFsbCBBcnRlbWlzIENhbWVyYXMgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBBVElLIEluc3RydW1lbnRzIGFzdHJvbm9taWNhbCBVU0IgYmFzZWQgY2FtZXJhcworICogQ2hlY2sgaXQgYXQgaHR0cDovL3d3dy5hdGlrLWluc3RydW1lbnRzLmNvbS8KKyAqLworI2RlZmluZSBGVERJX0FUSUtfQVRLMTZfUElECTB4REYzMAkvKiBBVElLIEFUSy0xNiBHcmF5c2NhbGUgQ2FtZXJhICovCisjZGVmaW5lIEZURElfQVRJS19BVEsxNkNfUElECTB4REYzMgkvKiBBVElLIEFUSy0xNkMgQ29sb3VyIENhbWVyYSAqLworI2RlZmluZSBGVERJX0FUSUtfQVRLMTZIUl9QSUQJMHhERjMxCS8qIEFUSUsgQVRLLTE2SFIgR3JheXNjYWxlIENhbWVyYSAqLworI2RlZmluZSBGVERJX0FUSUtfQVRLMTZIUkNfUElECTB4REYzMwkvKiBBVElLIEFUSy0xNkhSQyBDb2xvdXIgQ2FtZXJhICovCisjZGVmaW5lIEZURElfQVRJS19BVEsxNklDX1BJRCAgIDB4REYzNSAgLyogQVRJSyBBVEstMTZJQyBHcmF5c2NhbGUgQ2FtZXJhICovCisKKy8qCisgKiBZb3N0IEVuZ2luZWVyaW5nLCBJbmMuIHByb2R1Y3RzICh3d3cueW9zdGVuZ2luZWVyaW5nLmNvbSkuCisgKiBQSUQgMHhFMDUwIHN1Ym1pdHRlZCBieSBBYXJvbiBQcm9zZS4KKyAqLworI2RlZmluZSBGVERJX1lFSV9TRVJWT0NFTlRFUjMxX1BJRAkweEUwNTAJLyogWUVJIFNlcnZvQ2VudGVyMy4xIFVTQiAqLworCisvKgorICogRUxWIFVTQiBkZXZpY2VzIHN1Ym1pdHRlZCBieSBDaHJpc3RpYW4gQWJ0IG9mIEVMViAod3d3LmVsdi5kZSkuCisgKiBBbGwgb2YgdGhlc2UgZGV2aWNlcyB1c2UgRlRESSdzIHZlbmRvciBJRCAoMHgwNDAzKS4KKyAqCisgKiBUaGUgcHJldmlvdXNseSBpbmNsdWRlZCBQSUQgZm9yIHRoZSBVTyAxMDAgbW9kdWxlIHdhcyBpbmNvcnJlY3QuCisgKiBJbiBmYWN0LCB0aGF0IFBJRCB3YXMgZm9yIEVMVidzIFVSIDEwMCBVU0ItUlMyMzIgY29udmVydGVyICgweEZCNTgpLgorICoKKyAqIEFybWluIExhZXVnZXIgb3JpZ2luYWxseSBzZW50IHRoZSBQSUQgZm9yIHRoZSBVTSAxMDAgbW9kdWxlLgorICovCisjZGVmaW5lIEZURElfRUxWX0ZIWjEzMDBQQ19QSUQJMHhFMEU4CS8qIEZIWiAxMzAwIFBDICovCisjZGVmaW5lIEZURElfRUxWX1dTNTAwX1BJRAkweEUwRTkJLyogUEMtV2V0dGVyc3RhdGlvbiAoV1MgNTAwKSAqLworI2RlZmluZSBGVERJX0VMVl9IUzQ4NV9QSUQJMHhFMEVBCS8qIFVTQiB0byBSUy00ODUgYWRhcHRlciAqLworI2RlZmluZSBGVERJX0VMVl9FTTEwMTBQQ19QSUQJMHhFMEVGCS8qIEVuZ2VyeSBtb25pdG9yIEVNIDEwMTAgUEMgKi8KKyNkZWZpbmUgRlRESV9FTFZfQ1NJOF9QSUQJMHhFMEYwCS8qIENvbXB1dGVyLVNjaGFsdC1JbnRlcmZhY2UgKENTSSA4KSAqLworI2RlZmluZSBGVERJX0VMVl9FTTEwMDBETF9QSUQJMHhFMEYxCS8qIFBDLURhdGVubG9nZ2VyIGZ1ZXIgRW5lcmdpZW1vbml0b3IgKEVNIDEwMDAgREwpICovCisjZGVmaW5lIEZURElfRUxWX1BDSzEwMF9QSUQJMHhFMEYyCS8qIFBDLUthYmVsdGVzdGVyIChQQ0sgMTAwKSAqLworI2RlZmluZSBGVERJX0VMVl9SRlA1MDBfUElECTB4RTBGMwkvKiBIRi1MZWlzdHVuZ3NtZXNzZXIgKFJGUCA1MDApICovCisjZGVmaW5lIEZURElfRUxWX0ZTMjBTSUdfUElECTB4RTBGNAkvKiBTaWduYWxnZWJlciAoRlMgMjAgU0lHKSAqLworI2RlZmluZSBGVERJX0VMVl9XUzMwMFBDX1BJRAkweEUwRjYJLyogUEMtV2V0dGVyc3RhdGlvbiAoV1MgMzAwIFBDKSAqLworI2RlZmluZSBGVERJX1BISV9GSVNDT19QSUQgICAgICAweEU0MEIgIC8qIFBISSBGaXNjbyBVU0IgdG8gU2VyaWFsIGNhYmxlICovCisjZGVmaW5lIEZURElfRUxWX1VBRDhfUElECTB4RjA2OAkvKiBVU0ItQUQtV2FuZGxlciAoVUFEIDgpICovCisjZGVmaW5lIEZURElfRUxWX1VEQTdfUElECTB4RjA2OQkvKiBVU0ItREEtV2FuZGxlciAoVURBIDcpICovCisjZGVmaW5lIEZURElfRUxWX1VTSTJfUElECTB4RjA2QQkvKiBVU0ItU2Nocml0dG1vdG9yZW4tSW50ZXJmYWNlIChVU0kgMikgKi8KKyNkZWZpbmUgRlRESV9FTFZfVDExMDBfUElECTB4RjA2QgkvKiBUaGVybW9tZXRlciAoVCAxMTAwKSAqLworI2RlZmluZSBGVERJX0VMVl9QQ0QyMDBfUElECTB4RjA2QwkvKiBQQy1EYXRlbmxvZ2dlciAoUENEIDIwMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfVUxBMjAwX1BJRAkweEYwNkQJLyogVVNCLUxDRC1BbnN0ZXVlcnVuZyAoVUxBIDIwMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfQUxDODUwMF9QSUQJMHhGMDZFCS8qIEFMQyA4NTAwIEV4cGVydCAqLworI2RlZmluZSBGVERJX0VMVl9GSFoxMDAwUENfUElECTB4RjA2RgkvKiBGSFogMTAwMCBQQyAqLworI2RlZmluZSBGVERJX0VMVl9VUjEwMF9QSUQJMHhGQjU4CS8qIFVTQi1SUzIzMi1VbXNldHplciAoVVIgMTAwKSAqLworI2RlZmluZSBGVERJX0VMVl9VTTEwMF9QSUQJMHhGQjVBCS8qIFVTQi1Nb2R1bCBVTSAxMDAgKi8KKyNkZWZpbmUgRlRESV9FTFZfVU8xMDBfUElECTB4RkI1QgkvKiBVU0ItTW9kdWwgVU8gMTAwICovCisvKiBBZGRpdGlvbmFsIEVMViBQSURzIHRoYXQgZGVmYXVsdCB0byB1c2luZyB0aGUgRlRESSBEMlhYIGRyaXZlcnMgb24KKyAqIE1TIFdpbmRvd3MsIHJhdGhlciB0aGFuIHRoZSBGVERJIFZpcnR1YWwgQ29tIFBvcnQgZHJpdmVycy4KKyAqIE1heWJlIHRoZXNlIHdpbGwgYmUgZWFzaWVyIHRvIHVzZSB3aXRoIHRoZSBsaWJmdGRpL2xpYnVzYiB1c2VyLXNwYWNlCisgKiBkcml2ZXJzLCBvciBwb3NzaWJseSB0aGUgQ29tZWRpIGRyaXZlcnMgaW4gc29tZSBjYXNlcy4gKi8KKyNkZWZpbmUgRlRESV9FTFZfQ0xJNzAwMF9QSUQJMHhGQjU5CS8qIENvbXB1dGVyLUxpZ2h0LUludGVyZmFjZSAoQ0xJIDcwMDApICovCisjZGVmaW5lIEZURElfRUxWX1BQUzczMzBfUElECTB4RkI1QwkvKiBQcm9jZXNzb3ItUG93ZXItU3VwcGx5IChQUFMgNzMzMCkgKi8KKyNkZWZpbmUgRlRESV9FTFZfVEZNMTAwX1BJRAkweEZCNUQJLyogVGVtcGVyYXJ0dXItRmV1Y2h0ZSBNZXNzZ2VyYWV0IChURk0gMTAwKSAqLworI2RlZmluZSBGVERJX0VMVl9VREY3N19QSUQJMHhGQjVFCS8qIFVTQiBEQ0YgRnVua3VyaCAoVURGIDc3KSAqLworI2RlZmluZSBGVERJX0VMVl9VSU84OF9QSUQJMHhGQjVGCS8qIFVTQi1JL08gSW50ZXJmYWNlIChVSU8gODgpICovCisKKy8qCisgKiBFVkVSIEVjbyBQcm8gVVBTIChodHRwOi8vd3d3LmV2ZXIuY29tLnBsLykKKyAqLworCisjZGVmaW5lCUVWRVJfRUNPX1BST19DRFMJMHhlNTIwCS8qIFJTLTIzMiBjb252ZXJ0ZXIgKi8KKworLyoKKyAqIEFjdGl2ZSBSb2JvdHMgcHJvZHVjdCBpZHMuCisgKi8KKyNkZWZpbmUgRlRESV9BQ1RJVkVfUk9CT1RTX1BJRAkweEU1NDgJLyogVVNCIGNvbW1zIGJvYXJkICovCisKKy8qIFB5cmFtaWQgQ29tcHV0ZXIgR21iSCAqLworI2RlZmluZSBGVERJX1BZUkFNSURfUElECTB4RTZDOAkvKiBQeXJhbWlkIEFwcGxpYW5jZSBEaXNwbGF5ICovCisKKy8qIHd3dy5lbHN0ZXJlbGVjdHJpY2l0eS5jb20gRWxzdGVyIFVuaWNvbSBJSUkgT3B0aWNhbCBQcm9iZSAqLworI2RlZmluZSBGVERJX0VMU1RFUl9VTklDT01fUElECQkweEU3MDAgLyogUHJvZHVjdCBJZCAqLworCisvKgorICogR3VkZSBBbmFsb2ctIHVuZCBEaWdpdGFsc3lzdGVtZSBHbWJICisgKi8KKyNkZWZpbmUgRlRESV9HVURFQURTX0U4MDhfUElEICAgIDB4RTgwOAorI2RlZmluZSBGVERJX0dVREVBRFNfRTgwOV9QSUQgICAgMHhFODA5CisjZGVmaW5lIEZURElfR1VERUFEU19FODBBX1BJRCAgICAweEU4MEEKKyNkZWZpbmUgRlRESV9HVURFQURTX0U4MEJfUElEICAgIDB4RTgwQgorI2RlZmluZSBGVERJX0dVREVBRFNfRTgwQ19QSUQgICAgMHhFODBDCisjZGVmaW5lIEZURElfR1VERUFEU19FODBEX1BJRCAgICAweEU4MEQKKyNkZWZpbmUgRlRESV9HVURFQURTX0U4MEVfUElEICAgIDB4RTgwRQorI2RlZmluZSBGVERJX0dVREVBRFNfRTgwRl9QSUQgICAgMHhFODBGCisjZGVmaW5lIEZURElfR1VERUFEU19FODg4X1BJRCAgICAweEU4ODggIC8qIEV4cGVydCBJU0ROIENvbnRyb2wgVVNCICovCisjZGVmaW5lIEZURElfR1VERUFEU19FODg5X1BJRCAgICAweEU4ODkgIC8qIFVTQiBSUy0yMzIgT3B0b0JyaWRnZSAqLworI2RlZmluZSBGVERJX0dVREVBRFNfRTg4QV9QSUQgICAgMHhFODhBCisjZGVmaW5lIEZURElfR1VERUFEU19FODhCX1BJRCAgICAweEU4OEIKKyNkZWZpbmUgRlRESV9HVURFQURTX0U4OENfUElEICAgIDB4RTg4QworI2RlZmluZSBGVERJX0dVREVBRFNfRTg4RF9QSUQgICAgMHhFODhECisjZGVmaW5lIEZURElfR1VERUFEU19FODhFX1BJRCAgICAweEU4OEUKKyNkZWZpbmUgRlRESV9HVURFQURTX0U4OEZfUElEICAgIDB4RTg4RgorCisvKgorICogRWNsbyAoaHR0cDovL3d3dy5lY2xvLnB0LykgcHJvZHVjdCBJRHMuCisgKiBQSUQgMHhFQTkwIHN1Ym1pdHRlZCBieSBNYXJ0aW4gR3JpbGwuCisgKi8KKyNkZWZpbmUgRlRESV9FQ0xPX0NPTV8xV0lSRV9QSUQJMHhFQTkwCS8qIENPTSB0byAxLVdpcmUgVVNCIGFkYXB0b3IgKi8KKworLyogVE5DLVggVVNCLXRvLXBhY2tldC1yYWRpbyBhZGFwdGVyLCB2ZXJzaW9ucyBwcmlvciB0byAzLjAgKERMUCBtb2R1bGUpICovCisjZGVmaW5lIEZURElfVE5DX1hfUElECQkweEVCRTAKKworLyoKKyAqIFRlcmF0cm9uaWsgcHJvZHVjdCBpZHMuCisgKiBTdWJtaXR0ZWQgYnkgTy4gV/ZsZmVsc2NobmVpZGVyLgorICovCisjZGVmaW5lIEZURElfVEVSQVRST05JS19WQ1BfUElECSAweEVDODgJLyogVGVyYXRyb25payBkZXZpY2UgKHByZWZlcnJpbmcgVkNQIGRyaXZlciBvbiB3aW5kb3dzKSAqLworI2RlZmluZSBGVERJX1RFUkFUUk9OSUtfRDJYWF9QSUQgMHhFQzg5CS8qIFRlcmF0cm9uaWsgZGV2aWNlIChwcmVmZXJyaW5nIEQyWFggZHJpdmVyIG9uIHdpbmRvd3MpICovCisKKy8qIFJpZyBFeHBlcnQgVWtyYWluZSBkZXZpY2VzICovCisjZGVmaW5lIEZURElfUkVVX1RJTllfUElECQkweEVEMjIJLyogUmlnRXhwZXJ0IFRpbnkgKi8KKworLyoKKyAqIEhhbWVnIEhPODIwIGFuZCBITzg3MCBpbnRlcmZhY2UgKHVzaW5nIFZJRCAweDA0MDMpCisgKi8KKyNkZWZpbmUgICAgICAgIEhBTUVHX0hPODIwX1BJRCAgICAgICAgIDB4ZWQ3NAorI2RlZmluZSAgICAgICAgSEFNRUdfSE84NzBfUElEICAgICAgICAgMHhlZDcxCisKKy8qCisgKiAgTWF4U3RyZWFtIGRldmljZXMJd3d3Lm1heHN0cmVhbS5uZXQKKyAqLworI2RlZmluZSBGVERJX01BWFNUUkVBTV9QSUQJMHhFRTE4CS8qIFhiZWUgUEtHLVUgTW9kdWxlICovCisKKy8qCisgKiBtaWNyb0hBTSBwcm9kdWN0IElEcyAoaHR0cDovL3d3dy5taWNyb2hhbS5jb20pLgorICogU3VibWl0dGVkIGJ5IEp1c3RpbiBCdXJrZXQgKEtMMVJMKSA8em9ydG9uQGp0YW4uY29tPgorICogYW5kIE1pa2UgU3R1ZGVyIChLNkVFUCkgPGs2ZWVwQGhhbXNvZnR3YXJlLm9yZz4uCisgKiBJYW4gQWJib3R0IDxhYmJvdHRpQG1ldi5jby51az4gYWRkZWQgYSBmZXcgbW9yZSBmcm9tIHRoZSBkcml2ZXIgSU5GIGZpbGUuCisgKi8KKyNkZWZpbmUgRlRESV9NSEFNX0tXX1BJRCAweEVFRTgJCS8qIFVTQi1LVyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlRESV9NSEFNX1lTX1BJRCAweEVFRTkJCS8qIFVTQi1ZUyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlRESV9NSEFNX1k2X1BJRCAweEVFRUEJCS8qIFVTQi1ZNiBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlRESV9NSEFNX1k4X1BJRCAweEVFRUIJCS8qIFVTQi1ZOCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlRESV9NSEFNX0lDX1BJRCAweEVFRUMJCS8qIFVTQi1JQyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlRESV9NSEFNX0RCOV9QSUQgMHhFRUVECS8qIFVTQi1EQjkgaW50ZXJmYWNlICovCisjZGVmaW5lIEZURElfTUhBTV9SUzIzMl9QSUQgMHhFRUVFCS8qIFVTQi1SUzIzMiBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlRESV9NSEFNX1k5X1BJRCAweEVFRUYJCS8qIFVTQi1ZOSBpbnRlcmZhY2UgKi8KKworLyogRG9taW50ZWxsIHByb2R1Y3RzICBodHRwOi8vd3d3LmRvbWludGVsbC5jb20gKi8KKyNkZWZpbmUgRlRESV9ET01JTlRFTExfREdRR19QSUQJMHhFRjUwCS8qIE1hc3RlciAqLworI2RlZmluZSBGVERJX0RPTUlOVEVMTF9EVVNCX1BJRAkweEVGNTEJLyogRFVTQjAxIG1vZHVsZSAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbHVlcyBmb3IgdGhlIFBlcmxlIFN5c3RlbXMKKyAqIFVsdHJhUG9ydCBVU0Igc2VyaWFsIGNvbnZlcnRlcnMKKyAqLworI2RlZmluZSBGVERJX1BFUkxFX1VMVFJBUE9SVF9QSUQgMHhGMEMwCS8qIFBlcmxlIFVsdHJhUG9ydCBQcm9kdWN0IElkICovCisKKy8qIFNwcm9nIElJIChBbmRyZXcgQ3Jvc2xhbmQncyBTcHJvZ0lJIERDQyBpbnRlcmZhY2UpICovCisjZGVmaW5lIEZURElfU1BST0dfSUkJCTB4RjBDOAorCisvKiBhbiBpbmZyYXJlZCByZWNlaXZlciBmb3IgdXNlciBhY2Nlc3MgY29udHJvbCB3aXRoIElSIHRhZ3MgKi8KKyNkZWZpbmUgRlRESV9QSUVHUk9VUF9QSUQJMHhGMjA4CS8qIFByb2R1Y3QgSWQgKi8KKworLyogQUNUIFNvbHV0aW9ucyBIb21lUHJvIFpXYXZlIGludGVyZmFjZQorICAgKGh0dHA6Ly93d3cuYWN0LXNvbHV0aW9ucy5jb20vSG9tZVByby5odG0pICovCisjZGVmaW5lIEZURElfQUNUWldBVkVfUElECTB4RjJEMAorCisvKgorICogNE4tR0FMQVhZLkRFIFBJRHMgZm9yIENBTi1VU0IsIFVTQi1SUzIzMiwgVVNCLVJTNDIyLCBVU0ItUlM0ODUsCisgKiBVU0ItVFRZIGFjdGl2LCBVU0ItVFRZIHBhc3Npdi4gIFNvbWUgUElEcyBhcmUgdXNlZCBieSBzZXZlcmFsIGRldmljZXMKKyAqIGFuZCBJJ20gbm90IGVudGlyZWx5IHN1cmUgd2hpY2ggYXJlIHVzZWQgYnkgd2hpY2guCisgKi8KKyNkZWZpbmUgRlRESV80Tl9HQUxBWFlfREVfMV9QSUQJMHhGM0MwCisjZGVmaW5lIEZURElfNE5fR0FMQVhZX0RFXzJfUElECTB4RjNDMQorCisvKgorICogTGlueCBUZWNobm9sb2dpZXMgcHJvZHVjdCBpZHMKKyAqLworI2RlZmluZSBMSU5YX1NETVVTQlFTU19QSUQJMHhGNDQ4CS8qIExpbnggU0RNLVVTQi1RUy1TICovCisjZGVmaW5lIExJTlhfTUFTVEVSREVWRUwyX1BJRCAgIDB4RjQ0OSAgIC8qIExpbnggTWFzdGVyIERldmVsb3BtZW50IDIuMCAqLworI2RlZmluZSBMSU5YX0ZVVFVSRV8wX1BJRCAgIDB4RjQ0QSAgIC8qIExpbnggZnV0dXJlIGRldmljZSAqLworI2RlZmluZSBMSU5YX0ZVVFVSRV8xX1BJRCAgIDB4RjQ0QiAgIC8qIExpbnggZnV0dXJlIGRldmljZSAqLworI2RlZmluZSBMSU5YX0ZVVFVSRV8yX1BJRCAgIDB4RjQ0QyAgIC8qIExpbnggZnV0dXJlIGRldmljZSAqLworCisvKgorICogT2NlYW5pYyBwcm9kdWN0IGlkcworICovCisjZGVmaW5lIEZURElfT0NFQU5JQ19QSUQJMHhGNDYwICAvKiBPY2VhbmljIGRpdmUgaW5zdHJ1bWVudCAqLworCisvKgorICogU1VVTlRPIHByb2R1Y3QgaWRzCisgKi8KKyNkZWZpbmUgRlRESV9TVVVOVE9fU1BPUlRTX1BJRAkweEY2ODAJLyogU3V1bnRvIFNwb3J0cyBpbnN0cnVtZW50ICovCisKKy8qIFVTQi1VSVJUIC0gQW4gaW5mcmFyZWQgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyIHVzaW5nIHRoZSA4VTIzMkFNIGNoaXAgKi8KKy8qIGh0dHA6Ly9ob21lLmVhcnRobGluay5uZXQvfmpyaGVlcy9VU0JVSVJUL2luZGV4Lmh0bSAqLworI2RlZmluZSBGVERJX1VTQl9VSVJUX1BJRAkweEY4NTAJLyogUHJvZHVjdCBJZCAqLworCisvKiBDQ1MgSW5jLiBJQ0RVL0lDRFU0MCBwcm9kdWN0IElEIC0KKyAqIHRoZSBGVDIzMkJNIGlzIHVzZWQgaW4gYW4gaW4tY2lyY3VpdC1kZWJ1Z2dlciB1bml0IGZvciBQSUMxNidzL1BJQzE4J3MgKi8KKyNkZWZpbmUgRlRESV9DQ1NJQ0RVMjBfMF9QSUQgICAgMHhGOUQwCisjZGVmaW5lIEZURElfQ0NTSUNEVTQwXzFfUElEICAgIDB4RjlEMQorI2RlZmluZSBGVERJX0NDU01BQ0hYXzJfUElEICAgICAweEY5RDIKKyNkZWZpbmUgRlRESV9DQ1NMT0FEX05fR09fM19QSUQgMHhGOUQzCisjZGVmaW5lIEZURElfQ0NTSUNEVTY0XzRfUElEICAgIDB4RjlENAorI2RlZmluZSBGVERJX0NDU1BSSU1FOF81X1BJRCAgICAweEY5RDUKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZSBNYXRyaXggT3JiaXRhbCBMQ0QgZGlzcGxheXMsCisgKiB3aGljaCBhcmUgdGhlIEZUMjMyQk0gKCBzaW1pbGFyIHRvIHRoZSA4VTIzMkFNICkKKyAqLworI2RlZmluZSBGVERJX01UWE9SQl8wX1BJRCAgICAgIDB4RkEwMCAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLworI2RlZmluZSBGVERJX01UWE9SQl8xX1BJRCAgICAgIDB4RkEwMSAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLworI2RlZmluZSBGVERJX01UWE9SQl8yX1BJRCAgICAgIDB4RkEwMiAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLworI2RlZmluZSBGVERJX01UWE9SQl8zX1BJRCAgICAgIDB4RkEwMyAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLworI2RlZmluZSBGVERJX01UWE9SQl80X1BJRCAgICAgIDB4RkEwNCAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLworI2RlZmluZSBGVERJX01UWE9SQl81X1BJRCAgICAgIDB4RkEwNSAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLworI2RlZmluZSBGVERJX01UWE9SQl82X1BJRCAgICAgIDB4RkEwNiAgLyogTWF0cml4IE9yYml0YWwgUHJvZHVjdCBJZCAqLworCisvKgorICogSG9tZSBFbGVjdHJvbmljcyAod3d3LmhvbWUtZWxlY3Ryby5jb20pIFVTQiBnYWRnZXRzCisgKi8KKyNkZWZpbmUgRlRESV9IRV9USVJBMV9QSUQJMHhGQTc4CS8qIFRpcmEtMSBJUiB0cmFuc2NlaXZlciAqLworCisvKiBJbnNpZGUgQWNjZXNzbyBjb250YWN0bGVzcyByZWFkZXIgKGh0dHA6Ly93d3cuaW5zaWRlZnIuY29tKSAqLworI2RlZmluZSBJTlNJREVfQUNDRVNTTwkJMHhGQUQwCisKKy8qCisgKiBUaG9yTGFicyBVU0IgbW90b3IgZHJpdmVycworICovCisjZGVmaW5lIEZURElfVEhPUkxBQlNfUElECQkweGZhZjAgLyogVGhvckxhYnMgVVNCIG1vdG9yIGRyaXZlcnMgKi8KKworLyoKKyAqIFByb3RlZ28gcHJvZHVjdCBpZHMKKyAqLworI2RlZmluZSBQUk9URUdPX1NQRUNJQUxfMQkweEZDNzAJLyogc3BlY2lhbC91bmtub3duIGRldmljZSAqLworI2RlZmluZSBQUk9URUdPX1IyWDAJCTB4RkM3MQkvKiBSMjAwLVVTQiBUUk5HIHVuaXQgKFIyMTAsIFIyMjAsIGFuZCBSMjMwKSAqLworI2RlZmluZSBQUk9URUdPX1NQRUNJQUxfMwkweEZDNzIJLyogc3BlY2lhbC91bmtub3duIGRldmljZSAqLworI2RlZmluZSBQUk9URUdPX1NQRUNJQUxfNAkweEZDNzMJLyogc3BlY2lhbC91bmtub3duIGRldmljZSAqLworCisvKgorICogRFNTLTIwIFN5bmMgU3RhdGlvbiBmb3IgU29ueSBFcmljc3NvbiBQODAwCisgKi8KKyNkZWZpbmUgRlRESV9EU1MyMF9QSUQgICAgICAgICAgMHhGQzgyCisKKy8qIHd3dy5pcnRyYW5zLmRlIGRldmljZSAqLworI2RlZmluZSBGVERJX0lSVFJBTlNfUElEIDB4RkM2MCAvKiBQcm9kdWN0IElkICovCisKKy8qCisgKiBSTSBNaWNoYWVsaWRlcyBDQU52aWV3IFVTQiAoaHR0cDovL3d3dy5ybWNhbi5jb20pIChGVERJX1ZJRCkKKyAqIENBTiBmaWVsZGJ1cyBpbnRlcmZhY2UgYWRhcHRlciwgYWRkZWQgYnkgcG9ydCBHbWJIIHd3dy5wb3J0LmRlKQorICogSWFuIEFiYm90dCBjaGFuZ2VkIHRoZSBtYWNybyBuYW1lcyBmb3IgY29uc2lzdGVuY3kuCisgKi8KKyNkZWZpbmUgRlRESV9STV9DQU5WSUVXX1BJRAkweGZkNjAJLyogUHJvZHVjdCBJZCAqLworLyogd3d3LnRob3VnaHR0ZWNobm9sb2d5LmNvbS8gVFQtVVNCIHByb3ZpZGUgd2l0aCBwcm9jb21wIHVzZSBmdGRpX3NpbyAqLworI2RlZmluZSBGVERJX1RUVVNCX1BJRCAweEZGMjAgLyogUHJvZHVjdCBJZCAqLworCisjZGVmaW5lIEZURElfVVNCWF83MDdfUElEIDB4Rjg1NwkvKiBBRFNUZWNoIElSIEJsYXN0ZXIgVVNCWC03MDcgKEZURElfVklEKSAqLworCisjZGVmaW5lIEZURElfUkVMQUlTX1BJRAkweEZBMTAgIC8qIFJlbGFpcyBkZXZpY2UgZnJvbSBSdWRvbGYgR3VnbGVyICovCisKKy8qCisgKiBQQ0RKIHVzZSBmdGRpIGJhc2VkIGRqLWNvbnRyb2xsZXJzLiBUaGUgZm9sbG93aW5nIFBJRCBpcworICogZm9yIHRoZWlyIERBQy0yIGRldmljZSBodHRwOi8vd3d3LnBjZGpoYXJkd2FyZS5jb20vREFDMi5hc3AKKyAqICh0aGUgVklEIGlzIHRoZSBzdGFuZGFyZCBmdGRpIHZpZCAoRlRESV9WSUQpLCBQSUQgc2VudCBieSBXb3V0ZXIgUGFlc2VuKQorICovCisjZGVmaW5lIEZURElfUENESl9EQUMyX1BJRCAweEZBODgKKworI2RlZmluZSBGVERJX1IyMDAwS1VfVFJVRV9STkcJMHhGQjgwICAvKiBSMjAwMEtVIFRSVUUgUk5HIChGVERJX1ZJRCkgKi8KKworLyoKKyAqIERJRUJPTEQgQkNTIFNFOTIzIChGVERJX1ZJRCkKKyAqLworI2RlZmluZSBESUVCT0xEX0JDU19TRTkyM19QSUQJMHhmYjk5CisKKy8qIHd3dy5jcnlzdGFsZm9udHouY29tIGRldmljZXMKKyAqIC0gdGhhbnggZm9yIHByb3ZpZGluZyBmcmVlIGRldmljZXMgZm9yIGV2YWx1YXRpb24gIQorICogdGhleSB1c2UgdGhlIGZ0ZGkgY2hpcHNldCBmb3IgdGhlIFVTQiBpbnRlcmZhY2UKKyAqIGFuZCB0aGUgdmVuZG9yIGlkIGlzIHRoZSBzYW1lCisgKi8KKyNkZWZpbmUgRlRESV9YRl82MzJfUElEIDB4RkMwOAkvKiA2MzI6IDE2eDIgQ2hhcmFjdGVyIERpc3BsYXkgKi8KKyNkZWZpbmUgRlRESV9YRl82MzRfUElEIDB4RkMwOQkvKiA2MzQ6IDIweDQgQ2hhcmFjdGVyIERpc3BsYXkgKi8KKyNkZWZpbmUgRlRESV9YRl81NDdfUElEIDB4RkMwQQkvKiA1NDc6IFR3byBsaW5lIERpc3BsYXkgKi8KKyNkZWZpbmUgRlRESV9YRl82MzNfUElEIDB4RkMwQgkvKiA2MzM6IDE2eDIgQ2hhcmFjdGVyIERpc3BsYXkgd2l0aCBLZXlzICovCisjZGVmaW5lIEZURElfWEZfNjMxX1BJRCAweEZDMEMJLyogNjMxOiAyMHgyIENoYXJhY3RlciBEaXNwbGF5ICovCisjZGVmaW5lIEZURElfWEZfNjM1X1BJRCAweEZDMEQJLyogNjM1OiAyMHg0IENoYXJhY3RlciBEaXNwbGF5ICovCisjZGVmaW5lIEZURElfWEZfNjQwX1BJRCAweEZDMEUJLyogNjQwOiBUd28gbGluZSBEaXNwbGF5ICovCisjZGVmaW5lIEZURElfWEZfNjQyX1BJRCAweEZDMEYJLyogNjQyOiBUd28gbGluZSBEaXNwbGF5ICovCisKKy8qCisgKiBWaWRlbyBOZXR3b3JrcyBMaW1pdGVkIC8gSG9tZWNob2ljZSBpbiB0aGUgVUsgdXNlIGFuIGZ0ZGktYmFzZWQgZGV2aWNlCisgKiBmb3IgdGhlaXIgMU1iIGJyb2FkYmFuZCBpbnRlcm5ldCBzZXJ2aWNlLiAgVGhlIGZvbGxvd2luZyBQSUQgaXMgZXhoaWJpdGVkCisgKiBieSB0aGUgdXNiIGRldmljZSBzdXBwbGllZCAodGhlIFZJRCBpcyB0aGUgc3RhbmRhcmQgZnRkaSB2aWQgKEZURElfVklEKQorICovCisjZGVmaW5lIEZURElfVk5IQ1BDVVNCX0RfUElEIDB4ZmUzOCAvKiBQcm9kdWN0IElkICovCisKKy8qIEFscGhhTWljcm8gQ29tcG9uZW50cyBBTUMtMjMyVVNCMDEgZGV2aWNlIChGVERJX1ZJRCkgKi8KKyNkZWZpbmUgRlRESV9BTUMyMzJfUElEIDB4RkYwMCAvKiBQcm9kdWN0IElkICovCisKKy8qCisgKiBJQlMgZWxla3Ryb25payBwcm9kdWN0IGlkcyAoRlRESV9WSUQpCisgKiBTdWJtaXR0ZWQgYnkgVGhvbWFzIFNjaGxldXNlbmVyCisgKi8KKyNkZWZpbmUgRlRESV9JQlNfVVM0ODVfUElECTB4ZmYzOCAgLyogSUJTIFVTNDg1IChVU0I8LS0+UlM0MjIvNDg1IGludGVyZmFjZSkgKi8KKyNkZWZpbmUgRlRESV9JQlNfUElDUFJPX1BJRAkweGZmMzkgIC8qIElCUyBQSUMtUHJvZ3JhbW1lciAqLworI2RlZmluZSBGVERJX0lCU19QQ01DSUFfUElECTB4ZmYzYSAgLyogSUJTIENhcmQgcmVhZGVyIGZvciBQQ01DSUEgU1JBTS1jYXJkcyAqLworI2RlZmluZSBGVERJX0lCU19QSzFfUElECTB4ZmYzYiAgLyogSUJTIFBLMSAtIFBhcnRpY2VsIGNvdW50ZXIgKi8KKyNkZWZpbmUgRlRESV9JQlNfUlMyMzJNT05fUElECTB4ZmYzYyAgLyogSUJTIFJTMjMyIC0gTW9uaXRvciAqLworI2RlZmluZSBGVERJX0lCU19BUFA3MF9QSUQJMHhmZjNkICAvKiBBUFAgNzAgKGR1c3QgbW9uaXRvcmluZyBzeXN0ZW0pICovCisjZGVmaW5lIEZURElfSUJTX1BFRE9fUElECTB4ZmYzZSAgLyogSUJTIFBFRE8tTW9kZW0gKFJGIG1vZGVtIDg2OC4zNSBNSHopICovCisjZGVmaW5lIEZURElfSUJTX1BST0RfUElECTB4ZmYzZiAgLyogZnV0dXJlIGRldmljZSAqLworLyogd3d3LmNhbnVzYi5jb20gTGF3aWNlbCBDQU5VU0IgZGV2aWNlIChGVERJX1ZJRCkgKi8KKyNkZWZpbmUgRlRESV9DQU5VU0JfUElEIDB4RkZBOCAvKiBQcm9kdWN0IElkICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogdGhpcmQtcGFydHkgVklEL1BJRCBjb21ib3MgKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKgorICogQXRtZWwgU1RLNTQxCisgKi8KKyNkZWZpbmUgQVRNRUxfVklECQkweDAzZWIgLyogVmVuZG9yIElEICovCisjZGVmaW5lIFNUSzU0MV9QSUQJCTB4MjEwOSAvKiBaaWdiZWUgQ29udHJvbGxlciAqLworCisvKgorICogQmxhY2tmaW4gZ25JQ0UgSlRBRworICogaHR0cDovL2RvY3MuYmxhY2tmaW4udWNsaW51eC5vcmcvZG9rdS5waHA/aWQ9aHc6anRhZzpnbmljZQorICovCisjZGVmaW5lIEFESV9WSUQgCQkweDA0NTYKKyNkZWZpbmUgQURJX0dOSUNFX1BJRCAJCTB4RjAwMAorI2RlZmluZSBBRElfR05JQ0VQTFVTX1BJRCAJMHhGMDAxCisKKy8qCisgKiBSQVRPQyBSRVgtVVNCNjBGCisgKi8KKyNkZWZpbmUgUkFUT0NfVkVORE9SX0lECQkweDA1ODQKKyNkZWZpbmUgUkFUT0NfUFJPRFVDVF9JRF9VU0I2MEYJMHhiMDIwCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgQiZCIEVsZWN0cm9uaWNzIHByb2R1Y3RzLgorICovCisjZGVmaW5lIEJBTkRCX1ZJRAkJMHgwODU2CS8qIEImQiBFbGVjdHJvbmljcyBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgQkFOREJfVVNPVEw0X1BJRAkweEFDMDEJLyogVVNPVEw0IElzb2xhdGVkIFJTLTQ4NSBDb252ZXJ0ZXIgKi8KKyNkZWZpbmUgQkFOREJfVVNUTDRfUElECQkweEFDMDIJLyogVVNUTDQgUlMtNDg1IENvbnZlcnRlciAqLworI2RlZmluZSBCQU5EQl9VU085TUwyX1BJRAkweEFDMDMJLyogVVNPOU1MMiBJc29sYXRlZCBSUy0yMzIgQ29udmVydGVyICovCisjZGVmaW5lIEJBTkRCX1VTT1BUTDRfUElECTB4QUMxMQorI2RlZmluZSBCQU5EQl9VU1BUTDRfUElECTB4QUMxMgorI2RlZmluZSBCQU5EQl9VU085TUwyRFJfMl9QSUQJMHhBQzE2CisjZGVmaW5lIEJBTkRCX1VTTzlNTDJEUl9QSUQJMHhBQzE3CisjZGVmaW5lIEJBTkRCX1VTT1BUTDREUjJfUElECTB4QUMxOAkvKiBVU09QVEw0Ui0yIDItcG9ydCBJc29sYXRlZCBSUy0yMzIgQ29udmVydGVyICovCisjZGVmaW5lIEJBTkRCX1VTT1BUTDREUl9QSUQJMHhBQzE5CisjZGVmaW5lIEJBTkRCXzQ4NVVTQjlGXzJXX1BJRAkweEFDMjUKKyNkZWZpbmUgQkFOREJfNDg1VVNCOUZfNFdfUElECTB4QUMyNgorI2RlZmluZSBCQU5EQl8yMzJVU0I5TV9QSUQJMHhBQzI3CisjZGVmaW5lIEJBTkRCXzQ4NVVTQlRCXzJXX1BJRAkweEFDMzMKKyNkZWZpbmUgQkFOREJfNDg1VVNCVEJfNFdfUElECTB4QUMzNAorI2RlZmluZSBCQU5EQl9UVEw1VVNCOU1fUElECTB4QUM0OQorI2RlZmluZSBCQU5EQl9UVEwzVVNCOU1fUElECTB4QUM1MAorI2RlZmluZSBCQU5EQl9aWl9QUk9HMV9VU0JfUElECTB4QkEwMgorCisvKgorICogSW50cmVwaWQgQ29udHJvbCBTeXN0ZW1zIChodHRwOi8vd3d3LmludHJlcGlkY3MuY29tLykgVmFsdWVDQU4gYW5kIE5lb1ZJCisgKi8KKyNkZWZpbmUgSU5UUkVQSURfVklECQkweDA5M0MKKyNkZWZpbmUgSU5UUkVQSURfVkFMVUVDQU5fUElECTB4MDYwMQorI2RlZmluZSBJTlRSRVBJRF9ORU9WSV9QSUQJMHgwNzAxCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgSUQgVEVDSCAod3d3LmlkdC1uZXQuY29tKSBkZXZpY2VzCisgKi8KKyNkZWZpbmUgSURURUNIX1ZJRAkJMHgwQUNECS8qIElEIFRFQ0ggVmVuZG9yIElEICovCisjZGVmaW5lIElEVEVDSF9JRFQxMjIxVV9QSUQJMHgwMzAwCS8qIElEVDEyMjFVIFVTQiB0byBSUy0yMzIgYWRhcHRlciAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIE9tbmlkaXJlY3Rpb25hbCBDb250cm9sIFRlY2hub2xvZ3ksIEluYy4gZGV2aWNlcworICovCisjZGVmaW5lIE9DVF9WSUQJCQkweDBCMzkJLyogT0NUIHZlbmRvciBJRCAqLworLyogTm90ZTogT0NUIFVTMTAxIGlzIGFsc28gcmViYWRnZWQgYXMgRGljayBTbWl0aCBFbGVjdHJvbmljcyAoTlopIFhINjM4MSAqLworLyogQWxzbyByZWJhZGdlZCBhcyBEaWNrIFNtaXRoIEVsZWN0cm9uaWNzIChBdXMpIFhINjQ1MSAqLworLyogQWxzbyByZWJhZGdlZCBhcyBTSUlHIEluYy4gbW9kZWwgVVMyMzA4IGhhcmR3YXJlIHZlcnNpb24gMSAqLworI2RlZmluZSBPQ1RfVVMxMDFfUElECQkweDA0MjEJLyogT0NUIFVTMTAxIFVTQiB0byBSUy0yMzIgKi8KKworLyoKKyAqIEljb20gSUQtMSBkaWdpdGFsIHRyYW5zY2VpdmVyCisgKi8KKworI2RlZmluZSBJQ09NX0lEMV9WSUQgICAgICAgICAgICAweDBDMjYKKyNkZWZpbmUgSUNPTV9JRDFfUElEICAgICAgICAgICAgMHgwMDA0CisKKy8qCisgKiBHTiBPdG9tZXRyaWNzIChodHRwOi8vd3d3Lm90b21ldHJpY3MuY29tKQorICogU3VibWl0dGVkIGJ5IFZpbGxlIFN1bmRiZXJnLgorICovCisjZGVmaW5lIEdOX09UT01FVFJJQ1NfVklECTB4MGMzMwkvKiBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgQVVSSUNBTF9VU0JfUElECQkweDAwMTAJLyogQXVyaWNhbCBVU0IgQXVkaW9tZXRlciAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbHVlcyBmb3IgdGhlIFNlYWxldmVsIFNlYUxJTksrIGFkYXB0ZXJzLgorICogKE9yaWdpbmFsIGxpc3Qgc2VudCBieSBUdWFuIEhvYW5nLiAgSWFuIEFiYm90dCByZW5hbWVkIHRoZSBtYWNyb3MgYW5kCisgKiByZW1vdmVkIHNvbWUgUElEcyB0aGF0IGRvbid0IHNlZW0gdG8gbWF0Y2ggYW55IGV4aXN0aW5nIHByb2R1Y3RzLikKKyAqLworI2RlZmluZSBTRUFMRVZFTF9WSUQJCTB4MGM1MgkvKiBTZWFsZXZlbCBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjEwMV9QSUQJMHgyMTAxCS8qIFNlYUxJTksrMjMyICgyMTAxLzIxMDUpICovCisjZGVmaW5lIFNFQUxFVkVMXzIxMDJfUElECTB4MjEwMgkvKiBTZWFMSU5LKzQ4NSAoMjEwMikgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjEwM19QSUQJMHgyMTAzCS8qIFNlYUxJTksrMjMySSAoMjEwMykgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjEwNF9QSUQJMHgyMTA0CS8qIFNlYUxJTksrNDg1SSAoMjEwNCkgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjEwNl9QSUQJMHg5MDIwCS8qIFNlYUxJTksrNDIyICgyMTA2KSAqLworI2RlZmluZSBTRUFMRVZFTF8yMjAxXzFfUElECTB4MjIxMQkvKiBTZWFQT1JUKzIvMjMyICgyMjAxKSBQb3J0IDEgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjIwMV8yX1BJRAkweDIyMjEJLyogU2VhUE9SVCsyLzIzMiAoMjIwMSkgUG9ydCAyICovCisjZGVmaW5lIFNFQUxFVkVMXzIyMDJfMV9QSUQJMHgyMjEyCS8qIFNlYVBPUlQrMi80ODUgKDIyMDIpIFBvcnQgMSAqLworI2RlZmluZSBTRUFMRVZFTF8yMjAyXzJfUElECTB4MjIyMgkvKiBTZWFQT1JUKzIvNDg1ICgyMjAyKSBQb3J0IDIgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjIwM18xX1BJRAkweDIyMTMJLyogU2VhUE9SVCsyICgyMjAzKSBQb3J0IDEgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjIwM18yX1BJRAkweDIyMjMJLyogU2VhUE9SVCsyICgyMjAzKSBQb3J0IDIgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjQwMV8xX1BJRAkweDI0MTEJLyogU2VhUE9SVCs0LzIzMiAoMjQwMSkgUG9ydCAxICovCisjZGVmaW5lIFNFQUxFVkVMXzI0MDFfMl9QSUQJMHgyNDIxCS8qIFNlYVBPUlQrNC8yMzIgKDI0MDEpIFBvcnQgMiAqLworI2RlZmluZSBTRUFMRVZFTF8yNDAxXzNfUElECTB4MjQzMQkvKiBTZWFQT1JUKzQvMjMyICgyNDAxKSBQb3J0IDMgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjQwMV80X1BJRAkweDI0NDEJLyogU2VhUE9SVCs0LzIzMiAoMjQwMSkgUG9ydCA0ICovCisjZGVmaW5lIFNFQUxFVkVMXzI0MDJfMV9QSUQJMHgyNDEyCS8qIFNlYVBPUlQrNC80ODUgKDI0MDIpIFBvcnQgMSAqLworI2RlZmluZSBTRUFMRVZFTF8yNDAyXzJfUElECTB4MjQyMgkvKiBTZWFQT1JUKzQvNDg1ICgyNDAyKSBQb3J0IDIgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjQwMl8zX1BJRAkweDI0MzIJLyogU2VhUE9SVCs0LzQ4NSAoMjQwMikgUG9ydCAzICovCisjZGVmaW5lIFNFQUxFVkVMXzI0MDJfNF9QSUQJMHgyNDQyCS8qIFNlYVBPUlQrNC80ODUgKDI0MDIpIFBvcnQgNCAqLworI2RlZmluZSBTRUFMRVZFTF8yNDAzXzFfUElECTB4MjQxMwkvKiBTZWFQT1JUKzQgKDI0MDMpIFBvcnQgMSAqLworI2RlZmluZSBTRUFMRVZFTF8yNDAzXzJfUElECTB4MjQyMwkvKiBTZWFQT1JUKzQgKDI0MDMpIFBvcnQgMiAqLworI2RlZmluZSBTRUFMRVZFTF8yNDAzXzNfUElECTB4MjQzMwkvKiBTZWFQT1JUKzQgKDI0MDMpIFBvcnQgMyAqLworI2RlZmluZSBTRUFMRVZFTF8yNDAzXzRfUElECTB4MjQ0MwkvKiBTZWFQT1JUKzQgKDI0MDMpIFBvcnQgNCAqLworI2RlZmluZSBTRUFMRVZFTF8yODAxXzFfUElECTBYMjgxMQkvKiBTZWFMSU5LKzgvMjMyICgyODAxKSBQb3J0IDEgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjgwMV8yX1BJRAkwWDI4MjEJLyogU2VhTElOSys4LzIzMiAoMjgwMSkgUG9ydCAyICovCisjZGVmaW5lIFNFQUxFVkVMXzI4MDFfM19QSUQJMFgyODMxCS8qIFNlYUxJTksrOC8yMzIgKDI4MDEpIFBvcnQgMyAqLworI2RlZmluZSBTRUFMRVZFTF8yODAxXzRfUElECTBYMjg0MQkvKiBTZWFMSU5LKzgvMjMyICgyODAxKSBQb3J0IDQgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjgwMV81X1BJRAkwWDI4NTEJLyogU2VhTElOSys4LzIzMiAoMjgwMSkgUG9ydCA1ICovCisjZGVmaW5lIFNFQUxFVkVMXzI4MDFfNl9QSUQJMFgyODYxCS8qIFNlYUxJTksrOC8yMzIgKDI4MDEpIFBvcnQgNiAqLworI2RlZmluZSBTRUFMRVZFTF8yODAxXzdfUElECTBYMjg3MQkvKiBTZWFMSU5LKzgvMjMyICgyODAxKSBQb3J0IDcgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjgwMV84X1BJRAkwWDI4ODEJLyogU2VhTElOSys4LzIzMiAoMjgwMSkgUG9ydCA4ICovCisjZGVmaW5lIFNFQUxFVkVMXzI4MDJfMV9QSUQJMFgyODEyCS8qIFNlYUxJTksrOC80ODUgKDI4MDIpIFBvcnQgMSAqLworI2RlZmluZSBTRUFMRVZFTF8yODAyXzJfUElECTBYMjgyMgkvKiBTZWFMSU5LKzgvNDg1ICgyODAyKSBQb3J0IDIgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjgwMl8zX1BJRAkwWDI4MzIJLyogU2VhTElOSys4LzQ4NSAoMjgwMikgUG9ydCAzICovCisjZGVmaW5lIFNFQUxFVkVMXzI4MDJfNF9QSUQJMFgyODQyCS8qIFNlYUxJTksrOC80ODUgKDI4MDIpIFBvcnQgNCAqLworI2RlZmluZSBTRUFMRVZFTF8yODAyXzVfUElECTBYMjg1MgkvKiBTZWFMSU5LKzgvNDg1ICgyODAyKSBQb3J0IDUgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjgwMl82X1BJRAkwWDI4NjIJLyogU2VhTElOSys4LzQ4NSAoMjgwMikgUG9ydCA2ICovCisjZGVmaW5lIFNFQUxFVkVMXzI4MDJfN19QSUQJMFgyODcyCS8qIFNlYUxJTksrOC80ODUgKDI4MDIpIFBvcnQgNyAqLworI2RlZmluZSBTRUFMRVZFTF8yODAyXzhfUElECTBYMjg4MgkvKiBTZWFMSU5LKzgvNDg1ICgyODAyKSBQb3J0IDggKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjgwM18xX1BJRAkwWDI4MTMJLyogU2VhTElOSys4ICgyODAzKSBQb3J0IDEgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjgwM18yX1BJRAkwWDI4MjMgCS8qIFNlYUxJTksrOCAoMjgwMykgUG9ydCAyICovCisjZGVmaW5lIFNFQUxFVkVMXzI4MDNfM19QSUQJMFgyODMzIAkvKiBTZWFMSU5LKzggKDI4MDMpIFBvcnQgMyAqLworI2RlZmluZSBTRUFMRVZFTF8yODAzXzRfUElECTBYMjg0MyAJLyogU2VhTElOSys4ICgyODAzKSBQb3J0IDQgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjgwM181X1BJRAkwWDI4NTMgCS8qIFNlYUxJTksrOCAoMjgwMykgUG9ydCA1ICovCisjZGVmaW5lIFNFQUxFVkVMXzI4MDNfNl9QSUQJMFgyODYzIAkvKiBTZWFMSU5LKzggKDI4MDMpIFBvcnQgNiAqLworI2RlZmluZSBTRUFMRVZFTF8yODAzXzdfUElECTBYMjg3MyAJLyogU2VhTElOSys4ICgyODAzKSBQb3J0IDcgKi8KKyNkZWZpbmUgU0VBTEVWRUxfMjgwM184X1BJRAkwWDI4ODMgCS8qIFNlYUxJTksrOCAoMjgwMykgUG9ydCA4ICovCisKKy8qCisgKiBKRVRJIFNQRUNUUk9NRVRFUiBTUEVDQk9TIDEyMDEKKyAqIGh0dHA6Ly93d3cuamV0aS5jb20vcHJvZHVjdHMvc3lzL3NjYi9zY2IxMjAxLnBocAorICovCisjZGVmaW5lIEpFVElfVklECQkweDBjNmMKKyNkZWZpbmUgSkVUSV9TUEMxMjAxX1BJRAkweDA0YjIKKworLyoKKyAqIEZUREkgVVNCIFVBUlQgY2hpcHMgdXNlZCBpbiBjb25zdHJ1Y3Rpb24gcHJvamVjdHMgZnJvbSB0aGUKKyAqIEVsZWt0b3IgRWxlY3Ryb25pY3MgbWFnYXppbmUgKGh0dHA6Ly9lbGVrdG9yLWVsZWN0cm9uaWNzLmNvLnVrKQorICovCisjZGVmaW5lIEVMRUtUT1JfVklECQkweDBDN0QKKyNkZWZpbmUgRUxFS1RPUl9GVDMyM1JfUElECTB4MDAwNQkvKiBSRklELVJlYWRlciwgaXNzdWUgMDktMjAwNiAqLworCisvKgorICogUG9zaWZsZXggaW5jIHJldGFpbCBlcXVpcG1lbnQgKGh0dHA6Ly93d3cucG9zaWZsZXguY29tLnR3KQorICovCisjZGVmaW5lIFBPU0lGTEVYX1ZJRAkJMHgwZDNhICAvKiBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgUE9TSUZMRVhfUFA3MDAwX1BJRAkweDAzMDAgIC8qIFBQLTcwMDBJSSB0aGVybWFsIHByaW50ZXIgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWx1ZXMgZm9yIHR3byBLT0JJTCBjaGlwY2FyZCB0ZXJtaW5hbHMuCisgKi8KKyNkZWZpbmUgS09CSUxfVklECQkweDBkNDYJLyogS09CSUwgVmVuZG9yIElEICovCisjZGVmaW5lIEtPQklMX0NPTlZfQjFfUElECTB4MjAyMAkvKiBLT0JJTCBLb252ZXJ0ZXIgZm9yIEIxICovCisjZGVmaW5lIEtPQklMX0NPTlZfS0FBTl9QSUQJMHgyMDIxCS8qIEtPQklMX0tvbnZlcnRlciBmb3IgS0FBTiAqLworCisjZGVmaW5lIEZURElfTkZfUklDX1ZJRAkweDBEQ0QJLyogVmVuZG9yIElkICovCisjZGVmaW5lIEZURElfTkZfUklDX1BJRAkweDAwMDEJLyogUHJvZHVjdCBJZCAqLworCisvKgorICogRmFsY29tIFdpcmVsZXNzIENvbW11bmljYXRpb25zIEdtYkgKKyAqLworI2RlZmluZSBGQUxDT01fVklECQkweDBGOTQJLyogVmVuZG9yIElkICovCisjZGVmaW5lIEZBTENPTV9UV0lTVF9QSUQJMHgwMDAxCS8qIEZhbGNvbSBUd2lzdCBVU0IgR1BSUyBtb2RlbSAqLworI2RlZmluZSBGQUxDT01fU0FNQkFfUElECTB4MDAwNQkvKiBGYWxjb20gU2FtYmEgVVNCIEdQUlMgbW9kZW0gKi8KKworLyogTGFyc2VuIGFuZCBCcnVzZ2FhcmQgQWx0aVRyYWNrL1VTQnRyYWNrICAqLworI2RlZmluZSBMQVJTRU5CUlVTR0FBUkRfVklECQkweDBGRDgKKyNkZWZpbmUgTEJfQUxUSVRSQUNLX1BJRAkJMHgwMDAxCisKKy8qCisgKiBUVGkgKFRodXJsYnkgVGhhbmRhciBJbnN0cnVtZW50cykKKyAqLworI2RlZmluZSBUVElfVklECQkJMHgxMDNFCS8qIFZlbmRvciBJZCAqLworI2RlZmluZSBUVElfUUwzNTVQX1BJRAkJMHgwM0U4CS8qIFRUaSBRTDM1NVAgcG93ZXIgc3VwcGx5ICovCisKKy8qIEludGVyYmlvbWV0cmljcyBVU0IgSS9PIEJvYXJkICovCisvKiBEZXZlbG9wZWQgZm9yIEludGVyYmlvbWV0cmljcyBieSBSdWRvbGYgR3VnbGVyICovCisjZGVmaW5lIElOVEVSQklPTUVUUklDU19WSUQgICAgICAgICAgICAgIDB4MTIwOQorI2RlZmluZSBJTlRFUkJJT01FVFJJQ1NfSU9CT0FSRF9QSUQgICAgICAweDEwMDIKKyNkZWZpbmUgSU5URVJCSU9NRVRSSUNTX01JTklfSU9CT0FSRF9QSUQgMHgxMDA2CisKKy8qCisgKiBUZXN0byBwcm9kdWN0cyAoaHR0cDovL3d3dy50ZXN0by5jb20vKQorICogU3VibWl0dGVkIGJ5IENvbGluIExlcm95CisgKi8KKyNkZWZpbmUgVEVTVE9fVklECQkJMHgxMjhECisjZGVmaW5lIFRFU1RPX1VTQl9JTlRFUkZBQ0VfUElECQkweDAwMDEKKworLyoKKyAqIE1vYmlsaXR5IEVsZWN0cm9uaWNzIHByb2R1Y3RzLgorICovCisjZGVmaW5lIE1PQklMSVRZX1ZJRAkJCTB4MTM0MgorI2RlZmluZSBNT0JJTElUWV9VU0JfU0VSSUFMX1BJRAkJMHgwMjAyCS8qIEVhc2lEb2NrIFVTQiAyMDAgc2VyaWFsICovCisKKy8qCisgKiBGSUMgLyBPcGVuTW9rbywgSW5jLiBodHRwOi8vd2lraS5vcGVubW9rby5vcmcvd2lraS9OZW8xOTczX0RlYnVnX0JvYXJkX3YzCisgKiBTdWJtaXR0ZWQgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG9wZW5tb2tvLm9yZz4KKyAqLworI2RlZmluZQlGSUNfVklECQkJMHgxNDU3CisjZGVmaW5lCUZJQ19ORU8xOTczX0RFQlVHX1BJRAkweDUxMTgKKworLyogT2xpbWV4ICovCisjZGVmaW5lIE9MSU1FWF9WSUQJCQkweDE1QkEKKyNkZWZpbmUgT0xJTUVYX0FSTV9VU0JfT0NEX1BJRAkJMHgwMDAzCisKKy8qCisgKiBUZWxsZHVzIFRlY2hub2xvZ2llcworICovCisjZGVmaW5lIFRFTExEVVNfVklECQkJMHgxNzgxCS8qIFZlbmRvciBJRCAqLworI2RlZmluZSBURUxMRFVTX1RFTExTVElDS19QSUQJCTB4MEMzMAkvKiBSRiBjb250cm9sIGRvbmdsZSA0MzMgTUh6IHVzaW5nIEZUMjMyUkwgKi8KKworLyoKKyAqIEJheWVyIEFzY2Vuc2lhIENvbnRvdXIgYmxvb2QgZ2x1Y29zZSBtZXRlciBVU0ItY29udmVydGVyIGNhYmxlLgorICogaHR0cDovL3dpbmdsdWNvZmFjdHMuY29tL2NhYmxlcy8KKyAqLworI2RlZmluZSBCQVlFUl9WSUQgICAgICAgICAgICAgICAgICAgICAgMHgxQTc5CisjZGVmaW5lIEJBWUVSX0NPTlRPVVJfQ0FCTEVfUElEICAgICAgICAweDYwMDEKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZSBNYXRyaXggT3JiaXRhbCBGVERJIFJhbmdlCisgKiBBbnl0aGluZyBpbiB0aGlzIHJhbmdlIHdpbGwgdXNlIGFuIEZUMjMyUkwuCisgKi8KKyNkZWZpbmUgTVRYT1JCX1ZJRAkJCTB4MUIzRAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTAwX1BJRAkweDAxMDAKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwMV9QSUQJMHgwMTAxCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMDJfUElECTB4MDEwMgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTAzX1BJRAkweDAxMDMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwNF9QSUQJMHgwMTA0CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMDVfUElECTB4MDEwNQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTA2X1BJRAkweDAxMDYKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwN19QSUQJMHgwMTA3CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMDhfUElECTB4MDEwOAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTA5X1BJRAkweDAxMDkKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwQV9QSUQJMHgwMTBBCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMEJfUElECTB4MDEwQgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTBDX1BJRAkweDAxMEMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEwRF9QSUQJMHgwMTBECisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMEVfUElECTB4MDEwRQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTBGX1BJRAkweDAxMEYKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExMF9QSUQJMHgwMTEwCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMTFfUElECTB4MDExMQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTEyX1BJRAkweDAxMTIKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExM19QSUQJMHgwMTEzCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMTRfUElECTB4MDExNAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTE1X1BJRAkweDAxMTUKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExNl9QSUQJMHgwMTE2CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMTdfUElECTB4MDExNworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTE4X1BJRAkweDAxMTgKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExOV9QSUQJMHgwMTE5CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMUFfUElECTB4MDExQQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTFCX1BJRAkweDAxMUIKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExQ19QSUQJMHgwMTFDCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMURfUElECTB4MDExRAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTFFX1BJRAkweDAxMUUKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDExRl9QSUQJMHgwMTFGCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMjBfUElECTB4MDEyMAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTIxX1BJRAkweDAxMjEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyMl9QSUQJMHgwMTIyCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMjNfUElECTB4MDEyMworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTI0X1BJRAkweDAxMjQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyNV9QSUQJMHgwMTI1CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMjZfUElECTB4MDEyNgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTI3X1BJRAkweDAxMjcKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyOF9QSUQJMHgwMTI4CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMjlfUElECTB4MDEyOQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTJBX1BJRAkweDAxMkEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyQl9QSUQJMHgwMTJCCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMkNfUElECTB4MDEyQworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTJEX1BJRAkweDAxMkQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEyRV9QSUQJMHgwMTJFCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMkZfUElECTB4MDEyRgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTMwX1BJRAkweDAxMzAKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzMV9QSUQJMHgwMTMxCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMzJfUElECTB4MDEzMgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTMzX1BJRAkweDAxMzMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzNF9QSUQJMHgwMTM0CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMzVfUElECTB4MDEzNQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTM2X1BJRAkweDAxMzYKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzN19QSUQJMHgwMTM3CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxMzhfUElECTB4MDEzOAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTM5X1BJRAkweDAxMzkKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzQV9QSUQJMHgwMTNBCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxM0JfUElECTB4MDEzQgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTNDX1BJRAkweDAxM0MKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDEzRF9QSUQJMHgwMTNECisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxM0VfUElECTB4MDEzRQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTNGX1BJRAkweDAxM0YKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0MF9QSUQJMHgwMTQwCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNDFfUElECTB4MDE0MQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTQyX1BJRAkweDAxNDIKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0M19QSUQJMHgwMTQzCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNDRfUElECTB4MDE0NAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTQ1X1BJRAkweDAxNDUKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0Nl9QSUQJMHgwMTQ2CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNDdfUElECTB4MDE0NworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTQ4X1BJRAkweDAxNDgKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0OV9QSUQJMHgwMTQ5CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNEFfUElECTB4MDE0QQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTRCX1BJRAkweDAxNEIKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0Q19QSUQJMHgwMTRDCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNERfUElECTB4MDE0RAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTRFX1BJRAkweDAxNEUKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE0Rl9QSUQJMHgwMTRGCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNTBfUElECTB4MDE1MAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTUxX1BJRAkweDAxNTEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1Ml9QSUQJMHgwMTUyCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNTNfUElECTB4MDE1MworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTU0X1BJRAkweDAxNTQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1NV9QSUQJMHgwMTU1CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNTZfUElECTB4MDE1NgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTU3X1BJRAkweDAxNTcKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1OF9QSUQJMHgwMTU4CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNTlfUElECTB4MDE1OQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTVBX1BJRAkweDAxNUEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1Ql9QSUQJMHgwMTVCCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNUNfUElECTB4MDE1QworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTVEX1BJRAkweDAxNUQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE1RV9QSUQJMHgwMTVFCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNUZfUElECTB4MDE1RgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTYwX1BJRAkweDAxNjAKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2MV9QSUQJMHgwMTYxCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNjJfUElECTB4MDE2MgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTYzX1BJRAkweDAxNjMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2NF9QSUQJMHgwMTY0CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNjVfUElECTB4MDE2NQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTY2X1BJRAkweDAxNjYKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2N19QSUQJMHgwMTY3CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNjhfUElECTB4MDE2OAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTY5X1BJRAkweDAxNjkKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2QV9QSUQJMHgwMTZBCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNkJfUElECTB4MDE2QgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTZDX1BJRAkweDAxNkMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE2RF9QSUQJMHgwMTZECisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNkVfUElECTB4MDE2RQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTZGX1BJRAkweDAxNkYKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3MF9QSUQJMHgwMTcwCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNzFfUElECTB4MDE3MQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTcyX1BJRAkweDAxNzIKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3M19QSUQJMHgwMTczCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNzRfUElECTB4MDE3NAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTc1X1BJRAkweDAxNzUKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3Nl9QSUQJMHgwMTc2CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxNzdfUElECTB4MDE3NworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTc4X1BJRAkweDAxNzgKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3OV9QSUQJMHgwMTc5CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxN0FfUElECTB4MDE3QQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTdCX1BJRAkweDAxN0IKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3Q19QSUQJMHgwMTdDCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxN0RfUElECTB4MDE3RAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTdFX1BJRAkweDAxN0UKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE3Rl9QSUQJMHgwMTdGCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxODBfUElECTB4MDE4MAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTgxX1BJRAkweDAxODEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4Ml9QSUQJMHgwMTgyCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxODNfUElECTB4MDE4MworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTg0X1BJRAkweDAxODQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4NV9QSUQJMHgwMTg1CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxODZfUElECTB4MDE4NgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTg3X1BJRAkweDAxODcKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4OF9QSUQJMHgwMTg4CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxODlfUElECTB4MDE4OQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMThBX1BJRAkweDAxOEEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4Ql9QSUQJMHgwMThCCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOENfUElECTB4MDE4QworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMThEX1BJRAkweDAxOEQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE4RV9QSUQJMHgwMThFCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOEZfUElECTB4MDE4RgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTkwX1BJRAkweDAxOTAKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5MV9QSUQJMHgwMTkxCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOTJfUElECTB4MDE5MgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTkzX1BJRAkweDAxOTMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5NF9QSUQJMHgwMTk0CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOTVfUElECTB4MDE5NQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTk2X1BJRAkweDAxOTYKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5N19QSUQJMHgwMTk3CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOThfUElECTB4MDE5OAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTk5X1BJRAkweDAxOTkKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5QV9QSUQJMHgwMTlBCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOUJfUElECTB4MDE5QgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTlDX1BJRAkweDAxOUMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDE5RF9QSUQJMHgwMTlECisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxOUVfUElECTB4MDE5RQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMTlGX1BJRAkweDAxOUYKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBMF9QSUQJMHgwMUEwCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQTFfUElECTB4MDFBMQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUEyX1BJRAkweDAxQTIKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBM19QSUQJMHgwMUEzCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQTRfUElECTB4MDFBNAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUE1X1BJRAkweDAxQTUKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBNl9QSUQJMHgwMUE2CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQTdfUElECTB4MDFBNworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUE4X1BJRAkweDAxQTgKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBOV9QSUQJMHgwMUE5CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQUFfUElECTB4MDFBQQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUFCX1BJRAkweDAxQUIKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBQ19QSUQJMHgwMUFDCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQURfUElECTB4MDFBRAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUFFX1BJRAkweDAxQUUKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFBRl9QSUQJMHgwMUFGCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQjBfUElECTB4MDFCMAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUIxX1BJRAkweDAxQjEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCMl9QSUQJMHgwMUIyCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQjNfUElECTB4MDFCMworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUI0X1BJRAkweDAxQjQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCNV9QSUQJMHgwMUI1CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQjZfUElECTB4MDFCNgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUI3X1BJRAkweDAxQjcKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCOF9QSUQJMHgwMUI4CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQjlfUElECTB4MDFCOQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUJBX1BJRAkweDAxQkEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCQl9QSUQJMHgwMUJCCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQkNfUElECTB4MDFCQworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUJEX1BJRAkweDAxQkQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFCRV9QSUQJMHgwMUJFCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQkZfUElECTB4MDFCRgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUMwX1BJRAkweDAxQzAKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDMV9QSUQJMHgwMUMxCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQzJfUElECTB4MDFDMgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUMzX1BJRAkweDAxQzMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDNF9QSUQJMHgwMUM0CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQzVfUElECTB4MDFDNQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUM2X1BJRAkweDAxQzYKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDN19QSUQJMHgwMUM3CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQzhfUElECTB4MDFDOAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUM5X1BJRAkweDAxQzkKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDQV9QSUQJMHgwMUNBCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQ0JfUElECTB4MDFDQgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUNDX1BJRAkweDAxQ0MKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFDRF9QSUQJMHgwMUNECisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxQ0VfUElECTB4MDFDRQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUNGX1BJRAkweDAxQ0YKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFEMF9QSUQJMHgwMUQwCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRDFfUElECTB4MDFEMQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUQyX1BJRAkweDAxRDIKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFEM19QSUQJMHgwMUQzCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRDRfUElECTB4MDFENAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUQ1X1BJRAkweDAxRDUKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFENl9QSUQJMHgwMUQ2CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRDdfUElECTB4MDFENworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUQ4X1BJRAkweDAxRDgKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFEOV9QSUQJMHgwMUQ5CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxREFfUElECTB4MDFEQQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMURCX1BJRAkweDAxREIKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFEQ19QSUQJMHgwMURDCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRERfUElECTB4MDFERAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMURFX1BJRAkweDAxREUKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFERl9QSUQJMHgwMURGCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRTBfUElECTB4MDFFMAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUUxX1BJRAkweDAxRTEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFMl9QSUQJMHgwMUUyCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRTNfUElECTB4MDFFMworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUU0X1BJRAkweDAxRTQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFNV9QSUQJMHgwMUU1CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRTZfUElECTB4MDFFNgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUU3X1BJRAkweDAxRTcKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFOF9QSUQJMHgwMUU4CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRTlfUElECTB4MDFFOQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUVBX1BJRAkweDAxRUEKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFQl9QSUQJMHgwMUVCCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRUNfUElECTB4MDFFQworI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUVEX1BJRAkweDAxRUQKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFFRV9QSUQJMHgwMUVFCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRUZfUElECTB4MDFFRgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUYwX1BJRAkweDAxRjAKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGMV9QSUQJMHgwMUYxCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRjJfUElECTB4MDFGMgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUYzX1BJRAkweDAxRjMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGNF9QSUQJMHgwMUY0CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRjVfUElECTB4MDFGNQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUY2X1BJRAkweDAxRjYKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGN19QSUQJMHgwMUY3CisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRjhfUElECTB4MDFGOAorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUY5X1BJRAkweDAxRjkKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGQV9QSUQJMHgwMUZBCisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRkJfUElECTB4MDFGQgorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUZDX1BJRAkweDAxRkMKKyNkZWZpbmUgTVRYT1JCX0ZURElfUkFOR0VfMDFGRF9QSUQJMHgwMUZECisjZGVmaW5lIE1UWE9SQl9GVERJX1JBTkdFXzAxRkVfUElECTB4MDFGRQorI2RlZmluZSBNVFhPUkJfRlRESV9SQU5HRV8wMUZGX1BJRAkweDAxRkYKKworCisKKy8qCisgKiBUaGUgTW9iaWxpdHkgTGFiIChUTUwpCisgKiBTdWJtaXR0ZWQgYnkgUGllcnJlIENhc3RlbGxhCisgKi8KKyNkZWZpbmUgVE1MX1ZJRAkJCTB4MUI5MQkvKiBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgVE1MX1VTQl9TRVJJQUxfUElECTB4MDA2NAkvKiBVU0IgLSBTZXJpYWwgQ29udmVydGVyICovCisKKy8qIEFsdGktMiBwcm9kdWN0cyAgaHR0cDovL3d3dy5hbHRpLTIuY29tICovCisjZGVmaW5lIEFMVEkyX1ZJRAkweDFCQzkKKyNkZWZpbmUgQUxUSTJfTjNfUElECTB4NjAwMQkvKiBOZXB0dW5lIDMgKi8KKworLyoKKyAqIERyZXNkZW4gRWxla3Ryb25pYyBTZW5zb3IgVGVybWluYWwgQm9hcmQKKyAqLworI2RlZmluZSBERV9WSUQJCQkweDFjZjEgLyogVmVuZG9yIElEICovCisjZGVmaW5lIFNUQl9QSUQJCQkweDAwMDEgLyogU2Vuc29yIFRlcm1pbmFsIEJvYXJkICovCisjZGVmaW5lIFdIVF9QSUQJCQkweDAwMDQgLyogV2lyZWxlc3MgSGFuZGhlbGQgVGVybWluYWwgKi8KKworLyoKKyAqIFBhcG91Y2ggcHJvZHVjdHMgKGh0dHA6Ly93d3cucGFwb3VjaC5jb20vKQorICogU3VibWl0dGVkIGJ5IEZvbGtlcnQgdmFuIEhldXNkZW4KKyAqLworCisjZGVmaW5lIFBBUE9VQ0hfVklECQkJMHg1MDUwCS8qIFZlbmRvciBJRCAqLworI2RlZmluZSBQQVBPVUNIX1RNVV9QSUQJCQkweDA0MDAJLyogVE1VIFVTQiBUaGVybW9tZXRlciAqLworI2RlZmluZSBQQVBPVUNIX1FVSURPNHg0X1BJRAkJMHgwOTAwCS8qIFF1aWRvIDQvNCBNb2R1bGUgKi8KKworLyoKKyAqIE1hcnZlbGwgU2hlZXZhUGx1ZworICovCisjZGVmaW5lIE1BUlZFTExfVklECQkweDllODgKKyNkZWZpbmUgTUFSVkVMTF9TSEVFVkFQTFVHX1BJRAkweDllOGYKKworLyoKKyAqIEV2b2x1dGlvbiBSb2JvdGljcyBwcm9kdWN0cyAoaHR0cDovL3d3dy5ldm9sdXRpb24uY29tLykuCisgKiBTdWJtaXR0ZWQgYnkgU2hhd24gTS4gTGF2ZWxsZS4KKyAqLworI2RlZmluZSBFVk9MVVRJT05fVklECQkweERFRUUJLyogVmVuZG9yIElEICovCisjZGVmaW5lIEVWT0xVVElPTl9FUjFfUElECTB4MDMwMAkvKiBFUjEgQ29udHJvbCBNb2R1bGUgKi8KKyNkZWZpbmUgRVZPXzhVMjMyQU1fUElECTB4MDJGRgkvKiBFdm9sdXRpb24gcm9ib3RpY3MgUkNNMiAoRlQyMzJBTSkqLworI2RlZmluZSBFVk9fSFlCUklEX1BJRAkJMHgwMzAyCS8qIEV2b2x1dGlvbiByb2JvdGljcyBSQ000IFBJRCAoRlQyMzJCTSkqLworI2RlZmluZSBFVk9fUkNNNF9QSUQJCTB4MDMwMwkvKiBFdm9sdXRpb24gcm9ib3RpY3MgUkNNNCBQSUQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCmluZGV4IDQ4NWZhOWMuLjJjZmUyNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpAQCAtMTI3LDggKzEyNyw5IEBACiAjZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VUzlNTDJfNAkweEFDMzAKICNkZWZpbmUgQkFOREJfREVWSUNFX0lEX1VTUFRMNF8yCTB4QUMzMQogI2RlZmluZSBCQU5EQl9ERVZJQ0VfSURfVVNQVEw0XzQJMHhBQzMyCi0jZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzIgICAgICAgMHhBQzQyCi0jZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzQgICAgICAgMHhBQzQ0CisjZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzIJMHhBQzQyCisjZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzQJMHhBQzQ0CisjZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VU09QVEwyXzQJMHhBQzI0CiAKIC8qIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMKICAqIEFURU4gVUMyMzI0IGRldmljZSB1c2luZyBNb3NjaGlwIE1DUzc4NDAKQEAgLTE5MSw2ICsxOTIsNyBAQAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU1BUTDRfNCl9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzIpfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMNF80KX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTT1BUTDJfNCl9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVRFTklOVEwsIEFURU5JTlRMX0RFVklDRV9JRF9VQzIzMjQpfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FURU5JTlRMLCBBVEVOSU5UTF9ERVZJQ0VfSURfVUMyMzIyKX0sCiAJe30JCQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLwpAQCAtMjA3LDYgKzIwOSw3IEBACiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTUFRMNF80KX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTT1BUTDRfMil9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzQpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMMl80KX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BVEVOSU5UTCwgQVRFTklOVExfREVWSUNFX0lEX1VDMjMyNCl9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVRFTklOVEwsIEFURU5JTlRMX0RFVklDRV9JRF9VQzIzMjIpfSwKIAl7fQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggOWEyYjkwMy4uNmU5NGE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtMzQwLDYgKzM0MCwxMCBAQAogI2RlZmluZSBGT1VSX0dfU1lTVEVNU19WRU5ET1JfSUQJCTB4MWM5ZQogI2RlZmluZSBGT1VSX0dfU1lTVEVNU19QUk9EVUNUX1cxNAkJMHg5NjAzCiAKKy8qIEhhaWVyIHByb2R1Y3RzICovCisjZGVmaW5lIEhBSUVSX1ZFTkRPUl9JRAkJCQkweDIwMWUKKyNkZWZpbmUgSEFJRVJfUFJPRFVDVF9DRTEwMAkJCTB4MjAwOQorCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgb3B0aW9uX2lkc1tdID0gewogCXsgVVNCX0RFVklDRShPUFRJT05fVkVORE9SX0lELCBPUFRJT05fUFJPRFVDVF9DT0xUKSB9LAogCXsgVVNCX0RFVklDRShPUFRJT05fVkVORE9SX0lELCBPUFRJT05fUFJPRFVDVF9SSUNPTEEpIH0sCkBAIC02NDEsNiArNjQ1LDcgQEAKIAl7IFVTQl9ERVZJQ0UoQUlSUExVU19WRU5ET1JfSUQsIEFJUlBMVVNfUFJPRFVDVF9NQ0Q2NTApIH0sCiAJeyBVU0JfREVWSUNFKFRMQVlURUNIX1ZFTkRPUl9JRCwgVExBWVRFQ0hfUFJPRFVDVF9URVU4MDApIH0sCiAJeyBVU0JfREVWSUNFKEZPVVJfR19TWVNURU1TX1ZFTkRPUl9JRCwgRk9VUl9HX1NZU1RFTVNfUFJPRFVDVF9XMTQpIH0sCisJeyBVU0JfREVWSUNFKEhBSUVSX1ZFTkRPUl9JRCwgSEFJRVJfUFJPRFVDVF9DRTEwMCkgfSwKIAl7IH0gLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgb3B0aW9uX2lkcyk7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggYWQxNDIyNy4uNDU1ZTZlNiAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtOTcwLDcgKzk3MCw3IEBACiAJCWlmIChtYXhfYmxvY2tzID4gRElPX01BWF9CTE9DS1MpCiAJCQltYXhfYmxvY2tzID0gRElPX01BWF9CTE9DS1M7CiAJCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgRElPX0NSRURJVFMgKwotCQkJCTIgKiBFWFQzX1FVT1RBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOworCQkJCUVYVDNfTUFYUVVPVEFTX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOwogCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJCWdvdG8gb3V0OwpAQCAtMzE0Niw4ICszMTQ2LDggQEAKIAogCQkvKiAodXNlcitncm91cCkqKG9sZCtuZXcpIHN0cnVjdHVyZSwgaW5vZGUgd3JpdGUgKHNiLAogCQkgKiBpbm9kZSBibG9jaywgPyAtIGJ1dCB0cnVuY2F0ZSBpbm9kZSB1cGRhdGUgaGFzIGl0KSAqLwotCQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIDIqKEVYVDNfUVVPVEFfSU5JVF9CTE9DS1MoaW5vZGUtPmlfc2IpKwotCQkJCQlFWFQzX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKSszKTsKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQzX01BWFFVT1RBU19JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikrCisJCQkJCUVYVDNfTUFYUVVPVEFTX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKzMpOwogCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJCWVycm9yID0gUFRSX0VSUihoYW5kbGUpOwogCQkJZ290byBlcnJfb3V0OwpAQCAtMzIzOSw3ICszMjM5LDcgQEAKICNpZmRlZiBDT05GSUdfUVVPVEEKIAkvKiBXZSBrbm93IHRoYXQgc3RydWN0dXJlIHdhcyBhbHJlYWR5IGFsbG9jYXRlZCBkdXJpbmcgdmZzX2RxX2luaXQgc28KIAkgKiB3ZSB3aWxsIGJlIHVwZGF0aW5nIG9ubHkgdGhlIGRhdGEgYmxvY2tzICsgaW5vZGVzICovCi0JcmV0ICs9IDIqRVhUM19RVU9UQV9UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpOworCXJldCArPSBFWFQzX01BWFFVT1RBU19UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpOwogI2VuZGlmCiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCmluZGV4IGFhZDY0MDAuLjdiMGU0NGY3IDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC0xNjk5LDcgKzE2OTksNyBAQAogcmV0cnk6CiAJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKIAkJCQkJRVhUM19JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKLQkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOworCQkJCQlFWFQzX01BWFFVT1RBU19JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKQEAgLTE3MzMsNyArMTczMyw3IEBACiByZXRyeToKIAloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikgKwogCQkJCQlFWFQzX0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyArIDMgKwotCQkJCQkyKkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKSk7CisJCQkJCUVYVDNfTUFYUVVPVEFTX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIApAQCAtMTc2OSw3ICsxNzY5LDcgQEAKIHJldHJ5OgogCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSArCiAJCQkJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgMyArCi0JCQkJCTIqRVhUM19RVU9UQV9JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKKwkJCQkJRVhUM19NQVhRVU9UQVNfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKSk7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCkBAIC0xOTIwLDcgKzE5MjAsNyBAQAogCXN0cnVjdCBleHQzX2lsb2MgaWxvYzsKIAlpbnQgZXJyID0gMCwgcmM7CiAKLQlsb2NrX3N1cGVyKHNiKTsKKwltdXRleF9sb2NrKCZFWFQzX1NCKHNiKS0+c19vcnBoYW5fbG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZFWFQzX0koaW5vZGUpLT5pX29ycGhhbikpCiAJCWdvdG8gb3V0X3VubG9jazsKIApAQCAtMTkyOSw5ICsxOTI5LDEzIEBACiAKIAkvKiBAQEAgRklYTUU6IE9ic2VydmF0aW9uIGZyb20gYXZpcm86CiAJICogSSB0aGluayBJIGNhbiB0cmlnZ2VyIEpfQVNTRVJUIGluIGV4dDNfb3JwaGFuX2FkZCgpLiAgV2UgYmxvY2sKLQkgKiBoZXJlIChvbiBsb2NrX3N1cGVyKCkpLCBzbyByYWNlIHdpdGggZXh0M19saW5rKCkgd2hpY2ggbWlnaHQgYnVtcAorCSAqIGhlcmUgKG9uIHNfb3JwaGFuX2xvY2spLCBzbyByYWNlIHdpdGggZXh0M19saW5rKCkgd2hpY2ggbWlnaHQgYnVtcAogCSAqIC0+aV9ubGluay4gRm9yLCBzYXkgaXQsIGNoYXJhY3RlciBkZXZpY2UuIE5vdCBhIHJlZ3VsYXIgZmlsZSwKIAkgKiBub3QgYSBkaXJlY3RvcnksIG5vdCBhIHN5bWxpbmsgYW5kIC0+aV9ubGluayA+IDAuCisJICoKKwkgKiB0eXRzbywgNC8yNS8yMDA5OiBJJ20gbm90IHN1cmUgaG93IHRoYXQgY291bGQgaGFwcGVuOworCSAqIHNob3VsZG4ndCB0aGUgZnMgY29yZSBwcm90ZWN0IHVzIGZyb20gdGhlc2Ugc29ydCBvZgorCSAqIHVubGluaygpL2xpbmsoKSByYWNlcz8KIAkgKi8KIAlKX0FTU0VSVCAoKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAogCQlTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB8fCBpbm9kZS0+aV9ubGluayA9PSAwKTsKQEAgLTE5NjgsNyArMTk3Miw3IEBACiAJamJkX2RlYnVnKDQsICJvcnBoYW4gaW5vZGUgJWx1IHdpbGwgcG9pbnQgdG8gJWRcbiIsCiAJCQlpbm9kZS0+aV9pbm8sIE5FWFRfT1JQSEFOKGlub2RlKSk7CiBvdXRfdW5sb2NrOgotCXVubG9ja19zdXBlcihzYik7CisJbXV0ZXhfdW5sb2NrKCZFWFQzX1NCKHNiKS0+c19vcnBoYW5fbG9jayk7CiAJZXh0M19zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE5ODYsMTEgKzE5OTAsOSBAQAogCXN0cnVjdCBleHQzX2lsb2MgaWxvYzsKIAlpbnQgZXJyID0gMDsKIAotCWxvY2tfc3VwZXIoaW5vZGUtPmlfc2IpOwotCWlmIChsaXN0X2VtcHR5KCZlaS0+aV9vcnBoYW4pKSB7Ci0JCXVubG9ja19zdXBlcihpbm9kZS0+aV9zYik7Ci0JCXJldHVybiAwOwotCX0KKwltdXRleF9sb2NrKCZFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19vcnBoYW5fbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmVpLT5pX29ycGhhbikpCisJCWdvdG8gb3V0OwogCiAJaW5vX25leHQgPSBORVhUX09SUEhBTihpbm9kZSk7CiAJcHJldiA9IGVpLT5pX29ycGhhbi5wcmV2OwpAQCAtMjA0MCw3ICsyMDQyLDcgQEAKIG91dF9lcnI6CiAJZXh0M19zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CiBvdXQ6Ci0JdW5sb2NrX3N1cGVyKGlub2RlLT5pX3NiKTsKKwltdXRleF91bmxvY2soJkVYVDNfU0IoaW5vZGUtPmlfc2IpLT5zX29ycGhhbl9sb2NrKTsKIAlyZXR1cm4gZXJyOwogCiBvdXRfYnJlbHNlOgpAQCAtMjE3NSw3ICsyMTc3LDcgQEAKIHJldHJ5OgogCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSArCiAJCQkJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgNSArCi0JCQkJCTIqRVhUM19RVU9UQV9JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKKwkJCQkJRVhUM19NQVhRVU9UQVNfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKSk7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCmRpZmYgLS1naXQgYS9mcy9leHQzL3Jlc2l6ZS5jIGIvZnMvZXh0My9yZXNpemUuYwppbmRleCA1ZjgzYjYxLi41NDM1MWFjIDEwMDY0NAotLS0gYS9mcy9leHQzL3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDMvcmVzaXplLmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAotCWxvY2tfc3VwZXIoc2IpOworCW11dGV4X2xvY2soJnNiaS0+c19yZXNpemVfbG9jayk7CiAJaWYgKGlucHV0LT5ncm91cCAhPSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBleGl0X2pvdXJuYWw7CkBAIC0zMjQsNyArMzI0LDcgQEAKIAlicmVsc2UoYmgpOwogCiBleGl0X2pvdXJuYWw6Ci0JdW5sb2NrX3N1cGVyKHNiKTsKKwltdXRleF91bmxvY2soJnNiaS0+c19yZXNpemVfbG9jayk7CiAJaWYgKChlcnIyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKIAkJZXJyID0gZXJyMjsKIApAQCAtNjYyLDExICs2NjIsMTIgQEAKICAqIGltcG9ydGFudCBwYXJ0IGlzIHRoYXQgdGhlIG5ldyBibG9jayBhbmQgaW5vZGUgY291bnRzIGFyZSBpbiB0aGUgYmFja3VwCiAgKiBzdXBlcmJsb2NrcywgYW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IGdyb3VwIG1ldGFkYXRhIGluIHRoZSBHRFQgYmFja3Vwcy4KICAqCi0gKiBXZSBkbyBub3QgbmVlZCBsb2NrX3N1cGVyKCkgZm9yIHRoaXMsIGJlY2F1c2UgdGhlc2UgYmxvY2tzIGFyZSBub3QKLSAqIG90aGVyd2lzZSB0b3VjaGVkIGJ5IHRoZSBmaWxlc3lzdGVtIGNvZGUgd2hlbiBpdCBpcyBtb3VudGVkLiAgV2UgZG9uJ3QKLSAqIG5lZWQgdG8gd29ycnkgYWJvdXQgbGFzdCBjaGFuZ2luZyBmcm9tIHNiaS0+c19ncm91cHNfY291bnQsIGJlY2F1c2UgdGhlCi0gKiB3b3JzdCB0aGF0IGNhbiBoYXBwZW4gaXMgdGhhdCB3ZSBkbyBub3QgY29weSB0aGUgZnVsbCBudW1iZXIgb2YgYmFja3VwcwotICogYXQgdGhpcyB0aW1lLiAgVGhlIHJlc2l6ZSB3aGljaCBjaGFuZ2VkIHNfZ3JvdXBzX2NvdW50IHdpbGwgYmFja3VwIGFnYWluLgorICogV2UgZG8gbm90IG5lZWQgdGFrZSB0aGUgc19yZXNpemVfbG9jayBmb3IgdGhpcywgYmVjYXVzZSB0aGVzZQorICogYmxvY2tzIGFyZSBub3Qgb3RoZXJ3aXNlIHRvdWNoZWQgYnkgdGhlIGZpbGVzeXN0ZW0gY29kZSB3aGVuIGl0IGlzCisgKiBtb3VudGVkLiAgV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBsYXN0IGNoYW5naW5nIGZyb20KKyAqIHNiaS0+c19ncm91cHNfY291bnQsIGJlY2F1c2UgdGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlbiBpcyB0aGF0IHdlCisgKiBkbyBub3QgY29weSB0aGUgZnVsbCBudW1iZXIgb2YgYmFja3VwcyBhdCB0aGlzIHRpbWUuICBUaGUgcmVzaXplCisgKiB3aGljaCBjaGFuZ2VkIHNfZ3JvdXBzX2NvdW50IHdpbGwgYmFja3VwIGFnYWluLgogICovCiBzdGF0aWMgdm9pZCB1cGRhdGVfYmFja3VwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgaW50IGJsa19vZmYsIGNoYXIgKmRhdGEsIGludCBzaXplKQpAQCAtODI1LDcgKzgyNiw3IEBACiAJCWdvdG8gZXhpdF9wdXQ7CiAJfQogCi0JbG9ja19zdXBlcihzYik7CisJbXV0ZXhfbG9jaygmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKIAlpZiAoaW5wdXQtPmdyb3VwICE9IHNiaS0+c19ncm91cHNfY291bnQpIHsKIAkJZXh0M193YXJuaW5nKHNiLCBfX2Z1bmNfXywKIAkJCSAgICAgIm11bHRpcGxlIHJlc2l6ZXJzIHJ1biBvbiBmaWxlc3lzdGVtISIpOwpAQCAtODU2LDcgKzg1Nyw3IEBACiAJLyoKIAkgKiBPSywgbm93IHdlJ3ZlIHNldCB1cCB0aGUgbmV3IGdyb3VwLiAgVGltZSB0byBtYWtlIGl0IGFjdGl2ZS4KIAkgKgotCSAqIEN1cnJlbnQga2VybmVscyBkb24ndCBsb2NrIGFsbCBhbGxvY2F0aW9ucyB2aWEgbG9ja19zdXBlcigpLAorCSAqIFdlIGRvIG5vdCBsb2NrIGFsbCBhbGxvY2F0aW9ucyB2aWEgc19yZXNpemVfbG9jawogCSAqIHNvIHdlIGhhdmUgdG8gYmUgc2FmZSB3cnQuIGNvbmN1cnJlbnQgYWNjZXNzZXMgdGhlIGdyb3VwCiAJICogZGF0YS4gIFNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0byBzZXQgYWxsIG9mIHRoZSByZWxldmFudAogCSAqIGdyb3VwIGRlc2NyaXB0b3IgZGF0YSBldGMuICpiZWZvcmUqIHdlIGVuYWJsZSB0aGUgZ3JvdXAuCkBAIC05MDAsMTIgKzkwMSwxMiBAQAogCSAqCiAJICogVGhlIHByZWNpc2UgcnVsZXMgd2UgdXNlIGFyZToKIAkgKgotCSAqICogV3JpdGVycyBvZiBzX2dyb3Vwc19jb3VudCAqbXVzdCogaG9sZCBsb2NrX3N1cGVyCisJICogKiBXcml0ZXJzIG9mIHNfZ3JvdXBzX2NvdW50ICptdXN0KiBob2xkIHNfcmVzaXplX2xvY2sKIAkgKiBBTkQKIAkgKiAqIFdyaXRlcnMgbXVzdCBwZXJmb3JtIGEgc21wX3dtYigpIGFmdGVyIHVwZGF0aW5nIGFsbCBkZXBlbmRlbnQKIAkgKiAgIGRhdGEgYW5kIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGdyb3VwcyBjb3VudAogCSAqCi0JICogKiBSZWFkZXJzIG11c3QgaG9sZCBsb2NrX3N1cGVyKCkgb3ZlciB0aGUgYWNjZXNzCisJICogKiBSZWFkZXJzIG11c3QgaG9sZCBzX3Jlc2l6ZV9sb2NrIG92ZXIgdGhlIGFjY2VzcwogCSAqIE9SCiAJICogKiBSZWFkZXJzIG11c3QgcGVyZm9ybSBhbiBzbXBfcm1iKCkgYWZ0ZXIgcmVhZGluZyB0aGUgZ3JvdXBzIGNvdW50CiAJICogICBhbmQgYmVmb3JlIHJlYWRpbmcgYW55IGRlcGVuZGVudCBkYXRhLgpAQCAtOTM2LDcgKzkzNyw3IEBACiAJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CiAKIGV4aXRfam91cm5hbDoKLQl1bmxvY2tfc3VwZXIoc2IpOworCW11dGV4X3VubG9jaygmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKIAlpZiAoKGVycjIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpKSAmJiAhZXJyKQogCQllcnIgPSBlcnIyOwogCWlmICghZXJyKSB7CkBAIC05NzMsNyArOTc0LDcgQEAKIAogCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbG9ja2luZyB3cnQgb3RoZXIgcmVzaXplcnMganVzdAogCSAqIHlldDogd2UncmUgZ29pbmcgdG8gcmV2YWxpZGF0ZSBlcy0+c19ibG9ja3NfY291bnQgYWZ0ZXIKLQkgKiB0YWtpbmcgbG9ja19zdXBlcigpIGJlbG93LiAqLworCSAqIHRha2luZyB0aGUgc19yZXNpemVfbG9jayBiZWxvdy4gKi8KIAlvX2Jsb2Nrc19jb3VudCA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCk7CiAJb19ncm91cHNfY291bnQgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CiAKQEAgLTEwNDUsMTEgKzEwNDYsMTEgQEAKIAkJZ290byBleGl0X3B1dDsKIAl9CiAKLQlsb2NrX3N1cGVyKHNiKTsKKwltdXRleF9sb2NrKCZFWFQzX1NCKHNiKS0+c19yZXNpemVfbG9jayk7CiAJaWYgKG9fYmxvY2tzX2NvdW50ICE9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpIHsKIAkJZXh0M193YXJuaW5nKHNiLCBfX2Z1bmNfXywKIAkJCSAgICAgIm11bHRpcGxlIHJlc2l6ZXJzIHJ1biBvbiBmaWxlc3lzdGVtISIpOwotCQl1bmxvY2tfc3VwZXIoc2IpOworCQltdXRleF91bmxvY2soJkVYVDNfU0Ioc2IpLT5zX3Jlc2l6ZV9sb2NrKTsKIAkJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGV4aXRfcHV0OwpAQCAtMTA1OSwxMyArMTA2MCwxMyBAQAogCQkJCQkJIEVYVDNfU0Ioc2IpLT5zX3NiaCkpKSB7CiAJCWV4dDNfd2FybmluZyhzYiwgX19mdW5jX18sCiAJCQkgICAgICJlcnJvciAlZCBvbiBqb3VybmFsIHdyaXRlIGFjY2VzcyIsIGVycik7Ci0JCXVubG9ja19zdXBlcihzYik7CisJCW11dGV4X3VubG9jaygmRVhUM19TQihzYiktPnNfcmVzaXplX2xvY2spOwogCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCQlnb3RvIGV4aXRfcHV0OwogCX0KIAllcy0+c19ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUzMihvX2Jsb2Nrc19jb3VudCArIGFkZCk7CiAJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKLQl1bmxvY2tfc3VwZXIoc2IpOworCW11dGV4X3VubG9jaygmRVhUM19TQihzYiktPnNfcmVzaXplX2xvY2spOwogCWV4dDNfZGVidWcoImZyZWVpbmcgYmxvY2tzICVsdSB0aHJvdWdoICJFM0ZTQkxLIlxuIiwgb19ibG9ja3NfY291bnQsCiAJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKIAlleHQzX2ZyZWVfYmxvY2tzX3NiKGhhbmRsZSwgc2IsIG9fYmxvY2tzX2NvdW50LCBhZGQsICZmcmVlZF9ibG9ja3MpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDdhZDFlOGMuLmFmYTJiNTYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTE5MjgsNiArMTkyOCw4IEBACiAJc2ItPmRxX29wID0gJmV4dDNfcXVvdGFfb3BlcmF0aW9uczsKICNlbmRpZgogCUlOSVRfTElTVF9IRUFEKCZzYmktPnNfb3JwaGFuKTsgLyogdW5saW5rZWQgYnV0IG9wZW4gZmlsZXMgKi8KKwltdXRleF9pbml0KCZzYmktPnNfb3JwaGFuX2xvY2spOworCW11dGV4X2luaXQoJnNiaS0+c19yZXNpemVfbG9jayk7CiAKIAlzYi0+c19yb290ID0gTlVMTDsKIApAQCAtMjAxNCwxNCArMjAxNiw3IEBACiAJfQogCiAJZXh0M19zZXR1cF9zdXBlciAoc2IsIGVzLCBzYi0+c19mbGFncyAmIE1TX1JET05MWSk7Ci0JLyoKLQkgKiBha3BtOiBjb3JlIHJlYWRfc3VwZXIoKSBjYWxscyBpbiBoZXJlIHdpdGggdGhlIHN1cGVyYmxvY2sgbG9ja2VkLgotCSAqIFRoYXQgZGVhZGxvY2tzLCBiZWNhdXNlIG9ycGhhbiBjbGVhbnVwIG5lZWRzIHRvIGxvY2sgdGhlIHN1cGVyYmxvY2sKLQkgKiBpbiBudW1lcm91cyBwbGFjZXMuICBIZXJlIHdlIGp1c3QgcG9wIHRoZSBsb2NrIC0gaXQncyByZWxhdGl2ZWx5Ci0JICogaGFybWxlc3MsIGJlY2F1c2Ugd2UgYXJlIG5vdyByZWFkeSB0byBhY2NlcHQgd3JpdGVfc3VwZXIoKSByZXF1ZXN0cywKLQkgKiBhbmQgYXZpcm8gc2F5cyB0aGF0J3MgdGhlIG9ubHkgcmVhc29uIGZvciBoYW5naW5nIG9udG8gdGhlCi0JICogc3VwZXJibG9jayBsb2NrLgotCSAqLworCiAJRVhUM19TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUM19PUlBIQU5fRlM7CiAJZXh0M19vcnBoYW5fY2xlYW51cChzYiwgZXMpOwogCUVYVDNfU0Ioc2IpLT5zX21vdW50X3N0YXRlICY9IH5FWFQzX09SUEhBTl9GUzsKQEAgLTI0MDMsMTMgKzIzOTgsMTEgQEAKIAlpZiAoam91cm5hbF9mbHVzaChqb3VybmFsKSA8IDApCiAJCWdvdG8gb3V0OwogCi0JbG9ja19zdXBlcihzYik7CiAJaWYgKEVYVDNfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSAmJgogCSAgICBzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewogCQlFWFQzX0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKIAkJZXh0M19jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKIAl9Ci0JdW5sb2NrX3N1cGVyKHNiKTsKIAogb3V0OgogCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbCk7CkBAIC0yNjAxLDEzICsyNTk0LDcgQEAKIAkJCSAgICAoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUM19WQUxJRF9GUykpCiAJCQkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOwogCi0JCQkvKgotCQkJICogV2UgaGF2ZSB0byB1bmxvY2sgc3VwZXIgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IKLQkJCSAqIHRyYW5zYWN0aW9ucy4KLQkJCSAqLwotCQkJdW5sb2NrX3N1cGVyKHNiKTsKIAkJCWV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOwotCQkJbG9ja19zdXBlcihzYik7CiAJCX0gZWxzZSB7CiAJCQlfX2xlMzIgcmV0OwogCQkJaWYgKChyZXQgPSBFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NC5oIGIvZnMvZXh0NC9leHQ0LmgKaW5kZXggYWIzMWU2NS4uNTZmOTI3MSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0LmgKKysrIGIvZnMvZXh0NC9leHQ0LmgKQEAgLTcwNCw2ICs3MDQsMTAgQEAKIAlfX3UxNiBpX2V4dHJhX2lzaXplOwogCiAJc3BpbmxvY2tfdCBpX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2s7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJLyogcXVvdGEgc3BhY2UgcmVzZXJ2YXRpb24sIG1hbmFnZWQgaW50ZXJuYWxseSBieSBxdW90YSBjb2RlICovCisJcXNpemVfdCBpX3Jlc2VydmVkX3F1b3RhOworI2VuZGlmCiAKIAkvKiBjb21wbGV0ZWQgYXN5bmMgRElPcyB0aGF0IG1pZ2h0IG5lZWQgdW53cml0dGVuIGV4dGVudHMgaGFuZGxpbmcgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGlfYWlvX2Rpb19jb21wbGV0ZV9saXN0OwpAQCAtMTQzNSw3ICsxNDM5LDcgQEAKIGV4dGVybiBpbnQgZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZV90ICpoYW5kbGUsCiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3QgZnJvbSk7CiBleHRlcm4gaW50IGV4dDRfcGFnZV9ta3dyaXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZik7Ci1leHRlcm4gcXNpemVfdCBleHQ0X2dldF9yZXNlcnZlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiBxc2l6ZV90ICpleHQ0X2dldF9yZXNlcnZlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGV4dGVybiBpbnQgZmx1c2hfYWlvX2Rpb19jb21wbGV0ZWRfSU8oc3RydWN0IGlub2RlICppbm9kZSk7CiAvKiBpb2N0bC5jICovCiBleHRlcm4gbG9uZyBleHQ0X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggNTM1MmRiMS4uYWI4MDc5NiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMTAwMywxNyArMTAwMywxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXFzaXplX3QgZXh0NF9nZXRfcmVzZXJ2ZWRfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSkKKyNpZmRlZiBDT05GSUdfUVVPVEEKK3FzaXplX3QgKmV4dDRfZ2V0X3Jlc2VydmVkX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsOwotCi0Jc3Bpbl9sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwotCXRvdGFsID0gRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9kYXRhX2Jsb2NrcyArCi0JCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3M7Ci0Jc3Bpbl91bmxvY2soJkVYVDRfSShpbm9kZSktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7Ci0KLQlyZXR1cm4gKHRvdGFsIDw8IGlub2RlLT5pX2Jsa2JpdHMpOworCXJldHVybiAmRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9xdW90YTsKIH0KKyNlbmRpZgogLyoKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyBuZWVkIHRvIHJlc2VydmUKICAqIHRvIGFsbG9jYXRlIEBibG9ja3MgZm9yIG5vbiBleHRlbnQgZmlsZSBiYXNlZCBmaWxlCkBAIC0xMDUxLDcgKzEwNDYsNyBAQAogc3RhdGljIHZvaWQgZXh0NF9kYV91cGRhdGVfcmVzZXJ2ZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdXNlZCkKIHsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKTsKLQlpbnQgdG90YWwsIG1kYiwgbWRiX2ZyZWU7CisJaW50IHRvdGFsLCBtZGIsIG1kYl9mcmVlLCBtZGJfY2xhaW0gPSAwOwogCiAJc3Bpbl9sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwogCS8qIHJlY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbWV0YWJsb2NrcyBzdGlsbCBuZWVkIHRvIGJlIHJlc2VydmVkICovCkBAIC0xMDY0LDcgKzEwNTksOSBAQAogCiAJaWYgKG1kYl9mcmVlKSB7CiAJCS8qIEFjY291bnQgZm9yIGFsbG9jYXRlZCBtZXRhX2Jsb2NrcyAqLwotCQltZGJfZnJlZSAtPSBFWFQ0X0koaW5vZGUpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrczsKKwkJbWRiX2NsYWltID0gRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7CisJCUJVR19PTihtZGJfZnJlZSA8IG1kYl9jbGFpbSk7CisJCW1kYl9mcmVlIC09IG1kYl9jbGFpbTsKIAogCQkvKiB1cGRhdGUgZnMgZGlydHkgYmxvY2tzIGNvdW50ZXIgKi8KIAkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwgbWRiX2ZyZWUpOwpAQCAtMTA3NSw4ICsxMDcyLDExIEBACiAJLyogdXBkYXRlIHBlci1pbm9kZSByZXNlcnZhdGlvbnMgKi8KIAlCVUdfT04odXNlZCAgPiBFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzKTsKIAlFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzIC09IHVzZWQ7CisJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwgdXNlZCArIG1kYl9jbGFpbSk7CiAJc3Bpbl91bmxvY2soJkVYVDRfSShpbm9kZSktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CiAKKwl2ZnNfZHFfY2xhaW1fYmxvY2soaW5vZGUsIHVzZWQgKyBtZGJfY2xhaW0pOworCiAJLyoKIAkgKiBmcmVlIHRob3NlIG92ZXItYm9va2luZyBxdW90YSBmb3IgbWV0YWRhdGEgYmxvY2tzCiAJICovCkBAIC0xODE2LDE5ICsxODE2LDE3IEBACiAKIAltZF9uZWVkZWQgPSBtZGJsb2NrcyAtIEVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3M7CiAJdG90YWwgPSBtZF9uZWVkZWQgKyBucmJsb2NrczsKKwlzcGluX3VubG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKIAogCS8qCiAJICogTWFrZSBxdW90YSByZXNlcnZhdGlvbiBoZXJlIHRvIHByZXZlbnQgcXVvdGEgb3ZlcmZsb3cKIAkgKiBsYXRlci4gUmVhbCBxdW90YSBhY2NvdW50aW5nIGlzIGRvbmUgYXQgcGFnZXMgd3JpdGVvdXQKIAkgKiB0aW1lLgogCSAqLwotCWlmICh2ZnNfZHFfcmVzZXJ2ZV9ibG9jayhpbm9kZSwgdG90YWwpKSB7Ci0JCXNwaW5fdW5sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOworCWlmICh2ZnNfZHFfcmVzZXJ2ZV9ibG9jayhpbm9kZSwgdG90YWwpKQogCQlyZXR1cm4gLUVEUVVPVDsKLQl9CiAKIAlpZiAoZXh0NF9jbGFpbV9mcmVlX2Jsb2NrcyhzYmksIHRvdGFsKSkgewotCQlzcGluX3VubG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKIAkJdmZzX2RxX3JlbGVhc2VfcmVzZXJ2YXRpb25fYmxvY2soaW5vZGUsIHRvdGFsKTsKIAkJaWYgKGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpIHsKIAkJCXlpZWxkKCk7CkBAIC0xODM2LDEwICsxODM0LDExIEBACiAJCX0KIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQorCXNwaW5fbG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKIAlFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzICs9IG5yYmxvY2tzOwotCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgPSBtZGJsb2NrczsKLQorCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgKz0gbWRfbmVlZGVkOwogCXNwaW5fdW5sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOworCiAJcmV0dXJuIDA7ICAgICAgIC8qIHN1Y2Nlc3MgKi8KIH0KIApAQCAtNDc5NCw2ICs0NzkzLDkgQEAKIAkJCSgoX191NjQpbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2ZpbGVfYWNsX2hpZ2gpKSA8PCAzMjsKIAlpbm9kZS0+aV9zaXplID0gZXh0NF9pc2l6ZShyYXdfaW5vZGUpOwogCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwllaS0+aV9yZXNlcnZlZF9xdW90YSA9IDA7CisjZW5kaWYKIAlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2dlbmVyYXRpb24pOwogCWVpLT5pX2Jsb2NrX2dyb3VwID0gaWxvYy5ibG9ja19ncm91cDsKIAllaS0+aV9sYXN0X2FsbG9jX2dyb3VwID0gfjA7CmRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuYyBiL2ZzL2V4dDQvbWJhbGxvYy5jCmluZGV4IGIxZmQzZGEuLmQzNGFmYWQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5jCisrKyBiL2ZzL2V4dDQvbWJhbGxvYy5jCkBAIC0yNzU1LDEyICsyNzU1LDYgQEAKIAlpZiAoIShhYy0+YWNfZmxhZ3MgJiBFWFQ0X01CX0RFTEFMTE9DX1JFU0VSVkVEKSkKIAkJLyogcmVsZWFzZSBhbGwgdGhlIHJlc2VydmVkIGJsb2NrcyBpZiBub24gZGVsYWxsb2MgKi8KIAkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwgcmVzZXJ2X2Jsa3MpOwotCWVsc2UgewotCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLAotCQkJCQkJYWMtPmFjX2JfZXguZmVfbGVuKTsKLQkJLyogY29udmVydCByZXNlcnZlZCBxdW90YSBibG9ja3MgdG8gcmVhbCBxdW90YSBibG9ja3MgKi8KLQkJdmZzX2RxX2NsYWltX2Jsb2NrKGFjLT5hY19pbm9kZSwgYWMtPmFjX2JfZXguZmVfbGVuKTsKLQl9CiAKIAlpZiAoc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXgpIHsKIAkJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCmluZGV4IDgyN2JkZTEuLjZlZDlhYTkgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3VwZXIuYworKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTcwNCw2ICs3MDQsOSBAQAogCWVpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrcyA9IDA7CiAJZWktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZyA9IDA7CiAJc3Bpbl9sb2NrX2luaXQoJihlaS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKSk7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJZWktPmlfcmVzZXJ2ZWRfcXVvdGEgPSAwOworI2VuZGlmCiAJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX2Fpb19kaW9fY29tcGxldGVfbGlzdCk7CiAJZWktPmN1cl9haW9fZGlvID0gTlVMTDsKIAllaS0+aV9zeW5jX3RpZCA9IDA7CkBAIC0xMDE0LDcgKzEwMTcsOSBAQAogCS5yZXNlcnZlX3NwYWNlCT0gZHF1b3RfcmVzZXJ2ZV9zcGFjZSwKIAkuY2xhaW1fc3BhY2UJPSBkcXVvdF9jbGFpbV9zcGFjZSwKIAkucmVsZWFzZV9yc3YJPSBkcXVvdF9yZWxlYXNlX3Jlc2VydmVkX3NwYWNlLAorI2lmZGVmIENPTkZJR19RVU9UQQogCS5nZXRfcmVzZXJ2ZWRfc3BhY2UgPSBleHQ0X2dldF9yZXNlcnZlZF9zcGFjZSwKKyNlbmRpZgogCS5hbGxvY19pbm9kZQk9IGRxdW90X2FsbG9jX2lub2RlLAogCS5mcmVlX3NwYWNlCT0gZHF1b3RfZnJlZV9zcGFjZSwKIAkuZnJlZV9pbm9kZQk9IGRxdW90X2ZyZWVfaW5vZGUsCmRpZmYgLS1naXQgYS9mcy9qYmQvam91cm5hbC5jIGIvZnMvamJkL2pvdXJuYWwuYwppbmRleCA0MTYwYWZhLi5iZDIyNGVlIDEwMDY0NAotLS0gYS9mcy9qYmQvam91cm5hbC5jCisrKyBiL2ZzL2piZC9qb3VybmFsLmMKQEAgLTE5MTMsNyArMTkxMyw3IEBACiB7CiAJamJkX2RlYnVnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJqYmQiLCBOVUxMKTsKIAlpZiAoamJkX2RlYnVnZnNfZGlyKQotCQlqYmRfZGVidWcgPSBkZWJ1Z2ZzX2NyZWF0ZV91OCgiamJkLWRlYnVnIiwgU19JUlVHTywKKwkJamJkX2RlYnVnID0gZGVidWdmc19jcmVhdGVfdTgoImpiZC1kZWJ1ZyIsIFNfSVJVR08gfCBTX0lXVVNSLAogCQkJCQkgICAgICAgamJkX2RlYnVnZnNfZGlyLAogCQkJCQkgICAgICAgJmpvdXJuYWxfZW5hYmxlX2RlYnVnKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2piZDIvam91cm5hbC5jIGIvZnMvamJkMi9qb3VybmFsLmMKaW5kZXggYjdjYTNhOS4uMTdhZjg3OSAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTIxMTUsNyArMjExNSw4IEBACiB7CiAJamJkMl9kZWJ1Z2ZzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigiamJkMiIsIE5VTEwpOwogCWlmIChqYmQyX2RlYnVnZnNfZGlyKQotCQlqYmQyX2RlYnVnID0gZGVidWdmc19jcmVhdGVfdTgoSkJEMl9ERUJVR19OQU1FLCBTX0lSVUdPLAorCQlqYmQyX2RlYnVnID0gZGVidWdmc19jcmVhdGVfdTgoSkJEMl9ERUJVR19OQU1FLAorCQkJCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCiAJCQkJCSAgICAgICBqYmQyX2RlYnVnZnNfZGlyLAogCQkJCQkgICAgICAgJmpiZDJfam91cm5hbF9lbmFibGVfZGVidWcpOwogfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuYyBiL2ZzL29jZnMyL2FsbG9jLmMKaW5kZXggZmI0ZTY3Mi4uZDE3YmRjNyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuYworKysgYi9mcy9vY2ZzMi9hbGxvYy5jCkBAIC0xNzY1LDkgKzE3NjUsOSBAQAogICoKICAqIFRoZSBhcnJheSBpbmRleCBvZiB0aGUgc3VidHJlZSByb290IGlzIHBhc3NlZCBiYWNrLgogICovCi1zdGF0aWMgaW50IG9jZnMyX2ZpbmRfc3VidHJlZV9yb290KHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCi0JCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKmxlZnQsCi0JCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0KQoraW50IG9jZnMyX2ZpbmRfc3VidHJlZV9yb290KHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKmxlZnQsCisJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0KQogewogCWludCBpID0gMDsKIApAQCAtMjg3Miw4ICsyODcyLDggQEAKICAqIFRoaXMgbG9va3Mgc2ltaWxhciwgYnV0IGlzIHN1YnRseSBkaWZmZXJlbnQgdG8KICAqIG9jZnMyX2ZpbmRfY3Bvc19mb3JfbGVmdF9sZWFmKCkuCiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfZmluZF9jcG9zX2Zvcl9yaWdodF9sZWFmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkJCSAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsIHUzMiAqY3BvcykKK2ludCBvY2ZzMl9maW5kX2Nwb3NfZm9yX3JpZ2h0X2xlYWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwgdTMyICpjcG9zKQogewogCWludCBpLCBqLCByZXQgPSAwOwogCXU2NCBibGtubzsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmggYi9mcy9vY2ZzMi9hbGxvYy5oCmluZGV4IDljMTIyZDU3Li4xZGI0MzU5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5oCisrKyBiL2ZzL29jZnMyL2FsbG9jLmgKQEAgLTMxNyw0ICszMTcsOSBAQAogaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3BhdGgoc3RydWN0IG9jZnMyX2NhY2hpbmdfaW5mbyAqY2ksCiAJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgpOworaW50IG9jZnMyX2ZpbmRfY3Bvc19mb3JfcmlnaHRfbGVhZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLCB1MzIgKmNwb3MpOworaW50IG9jZnMyX2ZpbmRfc3VidHJlZV9yb290KHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKmxlZnQsCisJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0KTsKICNlbmRpZiAvKiBPQ0ZTMl9BTExPQ19IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9uYW1laS5jIGIvZnMvb2NmczIvbmFtZWkuYwppbmRleCBmMDEwYjIyLi4zZTliNDYwMDIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL25hbWVpLmMKKysrIGIvZnMvb2NmczIvbmFtZWkuYwpAQCAtMjEwOCw2ICsyMTA4LDcgQEAKIAl9CiAJZGlkX3F1b3RhX2lub2RlID0gMTsKIAorCWlub2RlLT5pX25saW5rID0gMDsKIAkvKiBkbyB0aGUgcmVhbCB3b3JrIG5vdy4gKi8KIAlzdGF0dXMgPSBvY2ZzMl9ta25vZF9sb2NrZWQob3NiLCBkaXIsIGlub2RlLAogCQkJCSAgICAwLCAmbmV3X2RpX2JoLCBwYXJlbnRfZGlfYmgsIGhhbmRsZSwKQEAgLTIxMzYsNiArMjEzNyw3IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAorCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKIGxlYXZlOgogCWlmIChzdGF0dXMgPCAwICYmIGRpZF9xdW90YV9pbm9kZSkKIAkJdmZzX2RxX2ZyZWVfaW5vZGUoaW5vZGUpOwpAQCAtMjI2Nyw2ICsyMjY5LDggQEAKIAlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKIAlsZTMyX2FkZF9jcHUoJmRpLT5pX2ZsYWdzLCAtT0NGUzJfT1JQSEFORURfRkwpOwogCWRpLT5pX29ycGhhbmVkX3Nsb3QgPSAwOworCWlub2RlLT5pX25saW5rID0gMTsKKwlvY2ZzMl9zZXRfbGlua3NfY291bnQoZGksIGlub2RlLT5pX25saW5rKTsKIAlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOwogCiAJc3RhdHVzID0gb2NmczJfYWRkX2VudHJ5KGhhbmRsZSwgZGVudHJ5LCBpbm9kZSwKQEAgLTIyODQsNyArMjI4OCw2IEBACiAJCWdvdG8gb3V0X2NvbW1pdDsKIAl9CiAKLQlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CiAJZGVudHJ5LT5kX29wID0gJm9jZnMyX2RlbnRyeV9vcHM7CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAlzdGF0dXMgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvcmVmY291bnR0cmVlLmMgYi9mcy9vY2ZzMi9yZWZjb3VudHRyZWUuYwppbmRleCAzMDk2N2UzLi43NGRiMmJlIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9yZWZjb3VudHRyZWUuYworKysgYi9mcy9vY2ZzMi9yZWZjb3VudHRyZWUuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOwogfQogCi12b2lkIG9jZnMyX2tyZWZfcmVtb3ZlX3JlZmNvdW50X3RyZWUoc3RydWN0IGtyZWYgKmtyZWYpCitzdGF0aWMgdm9pZCBvY2ZzMl9rcmVmX3JlbW92ZV9yZWZjb3VudF90cmVlKHN0cnVjdCBrcmVmICprcmVmKQogewogCXN0cnVjdCBvY2ZzMl9yZWZjb3VudF90cmVlICp0cmVlID0KIAkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBvY2ZzMl9yZWZjb3VudF90cmVlLCByZl9nZXRjbnQpOwpAQCAtNTI0LDIzICs1MjQsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBvY2ZzMl9sb2NrX3JlZmNvdW50X3RyZWVfYnlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHJ3LAotCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9yZWZjb3VudF90cmVlICoqcmV0X3RyZWUsCi0JCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcmVmX2JoKQotewotCWludCByZXQ7Ci0JdTY0IHJlZl9ibGtubzsKLQotCXJldCA9IG9jZnMyX2dldF9yZWZjb3VudF9ibG9jayhpbm9kZSwgJnJlZl9ibGtubyk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIG9jZnMyX2xvY2tfcmVmY291bnRfdHJlZShPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIHJlZl9ibGtubywKLQkJCQkJcncsIHJldF90cmVlLCByZWZfYmgpOwotfQotCiB2b2lkIG9jZnMyX3VubG9ja19yZWZjb3VudF90cmVlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCXN0cnVjdCBvY2ZzMl9yZWZjb3VudF90cmVlICp0cmVlLCBpbnQgcncpCiB7CkBAIC05NjksNiArOTUyLDEwMyBAQAogfQogCiAvKgorICogRmluZCB0aGUgZW5kIHJhbmdlIGZvciBhIGxlYWYgcmVmY291bnQgYmxvY2sgaW5kaWNhdGVkIGJ5CisgKiBlbC0+bF9yZWNzW2luZGV4XS5lX2Jsa25vLgorICovCitzdGF0aWMgaW50IG9jZnMyX2dldF9yZWZjb3VudF9jcG9zX2VuZChzdHJ1Y3Qgb2NmczJfY2FjaGluZ19pbmZvICpjaSwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpyZWZfcm9vdF9iaCwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsCisJCQkJICAgICAgIGludCBpbmRleCwgIHUzMiAqY3Bvc19lbmQpCit7CisJaW50IHJldCwgaSwgc3VidHJlZV9yb290OworCXUzMiBjcG9zOworCXU2NCBibGtubzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb2NmczJfbWV0YWRhdGFfY2FjaGVfZ2V0X3N1cGVyKGNpKTsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTCwgKnJpZ2h0X3BhdGggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnRtcF9lbDsKKworCWlmIChpbmRleCA8IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMSkgeworCQkvKgorCQkgKiBXZSBoYXZlIGEgZXh0ZW50IHJlYyBhZnRlciBpbmRleCwgc28ganVzdCB1c2UgdGhlIGVfY3BvcworCQkgKiBvZiB0aGUgbmV4dCBleHRlbnQgcmVjLgorCQkgKi8KKwkJKmNwb3NfZW5kID0gbGUzMl90b19jcHUoZWwtPmxfcmVjc1tpbmRleCsxXS5lX2Nwb3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWViIHx8IChlYiAmJiAhZWItPmhfbmV4dF9sZWFmX2JsaykpIHsKKwkJLyoKKwkJICogV2UgYXJlIHRoZSBsYXN0IGV4dGVudCByZWMsIHNvIGFueSBoaWdoIGNwb3Mgc2hvdWxkCisJCSAqIGJlIHN0b3JlZCBpbiB0aGlzIGxlYWYgcmVmY291bnQgYmxvY2suCisJCSAqLworCQkqY3Bvc19lbmQgPSBVSU5UX01BWDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZXh0ZW50IGJsb2NrIGlzbid0IHRoZSBsYXN0IG9uZSwgd2UgaGF2ZSB0byBmaW5kCisJICogdGhlIHN1YnRyZWUgcm9vdCBiZXR3ZWVuIHRoaXMgZXh0ZW50IGJsb2NrIGFuZCB0aGUgbmV4dAorCSAqIGxlYWYgZXh0ZW50IGJsb2NrIGFuZCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgZV9jcG9zIGZyb20KKwkgKiB0aGUgc3Vicm9vdC4gT3RoZXJ3aXNlIHdlIG1heSBjb3JydXB0IHRoZSBiLXRyZWUuCisJICovCisJb2NmczJfaW5pdF9yZWZjb3VudF9leHRlbnRfdHJlZSgmZXQsIGNpLCByZWZfcm9vdF9iaCk7CisKKwlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aF9mcm9tX2V0KCZldCk7CisJaWYgKCFsZWZ0X3BhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwljcG9zID0gbGUzMl90b19jcHUoZWItPmhfbGlzdC5sX3JlY3NbaW5kZXhdLmVfY3Bvcyk7CisJcmV0ID0gb2NmczJfZmluZF9wYXRoKGNpLCBsZWZ0X3BhdGgsIGNwb3MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyaWdodF9wYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9wYXRoKGxlZnRfcGF0aCk7CisJaWYgKCFyaWdodF9wYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9yaWdodF9sZWFmKHNiLCBsZWZ0X3BhdGgsICZjcG9zKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZmluZF9wYXRoKGNpLCByaWdodF9wYXRoLCBjcG9zKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJc3VidHJlZV9yb290ID0gb2NmczJfZmluZF9zdWJ0cmVlX3Jvb3QoJmV0LCBsZWZ0X3BhdGgsCisJCQkJCSAgICAgICByaWdodF9wYXRoKTsKKworCXRtcF9lbCA9IGxlZnRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfcm9vdF0uZWw7CisJYmxrbm8gPSBsZWZ0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX3Jvb3QrMV0uYmgtPmJfYmxvY2tucjsKKwlmb3IgKGkgPSAwOyBpIDwgbGUzMl90b19jcHUodG1wX2VsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspIHsKKwkJaWYgKGxlNjRfdG9fY3B1KHRtcF9lbC0+bF9yZWNzW2ldLmVfYmxrbm8pID09IGJsa25vKSB7CisJCQkqY3Bvc19lbmQgPSBsZTMyX3RvX2NwdSh0bXBfZWwtPmxfcmVjc1tpKzFdLmVfY3Bvcyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCUJVR19PTihpID09IGxlMzJfdG9fY3B1KHRtcF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSk7CisKK291dDoKKwlvY2ZzMl9mcmVlX3BhdGgobGVmdF9wYXRoKTsKKwlvY2ZzMl9mcmVlX3BhdGgocmlnaHRfcGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIEdpdmVuIGEgY3BvcyBhbmQgbGVuLCB0cnkgdG8gZmluZCB0aGUgcmVmY291bnQgcmVjb3JkIHdoaWNoIGNvbnRhaW5zIGNwb3MuCiAgKiAxLiBJZiBjcG9zIGNhbiBiZSBmb3VuZCBpbiBvbmUgcmVmY291bnQgcmVjb3JkLCByZXR1cm4gdGhlIHJlY29yZC4KICAqIDIuIElmIGNwb3MgY2FuJ3QgYmUgZm91bmQsIHJldHVybiBhIGZha2UgcmVjb3JkIHdoaWNoIHN0YXJ0IGZyb20gY3BvcwpAQCAtOTgzLDEwICsxMDYzLDEwIEBACiAJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipyZXRfYmgpCiB7CiAJaW50IHJldCA9IDAsIGksIGZvdW5kOwotCXUzMiBsb3dfY3BvczsKKwl1MzIgbG93X2Nwb3MsIHVuaW5pdGlhbGl6ZWRfdmFyKGNwb3NfZW5kKTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICp0bXAsICpyZWMgPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoID0gTlVMTCwgKnJlZl9sZWFmX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb2NmczJfbWV0YWRhdGFfY2FjaGVfZ2V0X3N1cGVyKGNpKTsKIAlzdHJ1Y3Qgb2NmczJfcmVmY291bnRfYmxvY2sgKnJiID0KQEAgLTEwMzQsMTIgKzExMTQsMTYgQEAKIAkJfQogCX0KIAotCS8qIGFkanVzdCBsZW4gd2hlbiB3ZSBoYXZlIG9jZnMyX2V4dGVudF9yZWMgYWZ0ZXIgaXQuICovCi0JaWYgKGZvdW5kICYmIGkgPCBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDEpIHsKLQkJdG1wID0gJmVsLT5sX3JlY3NbaSsxXTsKKwlpZiAoZm91bmQpIHsKKwkJcmV0ID0gb2NmczJfZ2V0X3JlZmNvdW50X2Nwb3NfZW5kKGNpLCByZWZfcm9vdF9iaCwKKwkJCQkJCSAgZWIsIGVsLCBpLCAmY3Bvc19lbmQpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQogCi0JCWlmIChsZTMyX3RvX2NwdSh0bXAtPmVfY3BvcykgPCBjcG9zICsgbGVuKQotCQkJbGVuID0gbGUzMl90b19jcHUodG1wLT5lX2Nwb3MpIC0gY3BvczsKKwkJaWYgKGNwb3NfZW5kIDwgbG93X2Nwb3MgKyBsZW4pCisJCQlsZW4gPSBjcG9zX2VuZCAtIGxvd19jcG9zOwogCX0KIAogCXJldCA9IG9jZnMyX3JlYWRfcmVmY291bnRfYmxvY2soY2ksIGxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubyksCkBAIC0xNDE4LDcgKzE1MDIsNyBAQAogCiAJLyogY2hhbmdlIG9sZCBhbmQgbmV3IHJsX3VzZWQgYWNjb3JkaW5nbHkuICovCiAJbGUxNl9hZGRfY3B1KCZybC0+cmxfdXNlZCwgLW51bV9tb3ZlZCk7Ci0JbmV3X3JsLT5ybF91c2VkID0gY3B1X3RvX2xlMzIobnVtX21vdmVkKTsKKwluZXdfcmwtPnJsX3VzZWQgPSBjcHVfdG9fbGUxNihudW1fbW92ZWQpOwogCiAJc29ydCgmcmwtPnJsX3JlY3MsIGxlMTZfdG9fY3B1KHJsLT5ybF91c2VkKSwKIAkgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfcmVmY291bnRfcmVjKSwKQEAgLTE3OTcsNyArMTg4MSw4IEBACiAJCXJlY3NfbmVlZCsrOwogCiAJLyogSWYgdGhlIGxlYWYgYmxvY2sgZG9uJ3QgaGF2ZSBlbm91Z2ggcmVjb3JkLCBleHBhbmQgaXQuICovCi0JaWYgKGxlMTZfdG9fY3B1KHJmX2xpc3QtPnJsX3VzZWQpICsgcmVjc19uZWVkID4gcmZfbGlzdC0+cmxfY291bnQpIHsKKwlpZiAobGUxNl90b19jcHUocmZfbGlzdC0+cmxfdXNlZCkgKyByZWNzX25lZWQgPgorCQkJCQkgbGUxNl90b19jcHUocmZfbGlzdC0+cmxfY291bnQpKSB7CiAJCXN0cnVjdCBvY2ZzMl9yZWZjb3VudF9yZWMgdG1wX3JlYzsKIAkJdTY0IGNwb3MgPSBsZTY0X3RvX2NwdShvcmlnX3JlYy0+cl9jcG9zKTsKIAkJbGVuID0gbGUzMl90b19jcHUob3JpZ19yZWMtPnJfY2x1c3RlcnMpOwpAQCAtMTg1OSw3ICsxOTQ0LDcgQEAKIAkJbWVtY3B5KHRhaWxfcmVjLCBvcmlnX3JlYywgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9yZWZjb3VudF9yZWMpKTsKIAkJbGU2NF9hZGRfY3B1KCZ0YWlsX3JlYy0+cl9jcG9zLAogCQkJICAgICBsZTMyX3RvX2NwdSh0YWlsX3JlYy0+cl9jbHVzdGVycykgLSBsZW4pOwotCQl0YWlsX3JlYy0+cl9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KGxlbik7CisJCXRhaWxfcmVjLT5yX2NsdXN0ZXJzID0gY3B1X3RvX2xlMzIobGVuKTsKIAl9CiAKIAkvKgpAQCAtMzg0MCw4ICszOTI1LDcgQEAKIAl9CiAKIAlyZXQgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgZXQsIGNwb3MsCi0JCQljcHVfdG9fbGU2NChvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsCi0JCQkJCQkJICAgICBwX2NsdXN0ZXIpKSwKKwkJCW9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgcF9jbHVzdGVyKSwKIAkJCW51bV9jbHVzdGVycywgZXh0X2ZsYWdzLCBtZXRhX2FjKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTQyNTMsOCArNDMzNyw4IEBACiAgKiBAbmV3X2RlbnRyeTogICAgICAgIHRhcmdldCBkZW50cnkKICAqIEBwcmVzZXJ2ZTogIGlmIHRydWUsIHByZXNlcnZlIGFsbCBmaWxlIGF0dHJpYnV0ZXMKICAqLwotaW50IG9jZnMyX3Zmc19yZWZsaW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAotCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5LCBib29sIHByZXNlcnZlKQorc3RhdGljIGludCBvY2ZzMl92ZnNfcmVmbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSwgYm9vbCBwcmVzZXJ2ZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZXJyb3I7CmRpZmYgLS1naXQgYS9mcy9xdW90YS9kcXVvdC5jIGIvZnMvcXVvdGEvZHF1b3QuYwppbmRleCBjZDZiYjlhLi5kZWE4NmFiIDEwMDY0NAotLS0gYS9mcy9xdW90YS9kcXVvdC5jCisrKyBiL2ZzL3F1b3RhL2RxdW90LmMKQEAgLTMyMyw2ICszMjMsMzAgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHF1b3RfbWFya19kcXVvdF9kaXJ0eSk7CiAKKy8qIERpcnRpZnkgYWxsIHRoZSBkcXVvdHMgLSB0aGlzIGNhbiBibG9jayB3aGVuIGpvdXJuYWxsaW5nICovCitzdGF0aWMgaW5saW5lIGludCBtYXJrX2FsbF9kcXVvdF9kaXJ0eShzdHJ1Y3QgZHF1b3QgKiBjb25zdCAqZHF1b3QpCit7CisJaW50IHJldCwgZXJyLCBjbnQ7CisKKwlyZXQgPSBlcnIgPSAwOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAoZHF1b3RbY250XSkKKwkJCS8qIEV2ZW4gaW4gY2FzZSBvZiBlcnJvciB3ZSBoYXZlIHRvIGNvbnRpbnVlICovCisJCQlyZXQgPSBtYXJrX2RxdW90X2RpcnR5KGRxdW90W2NudF0pOworCQlpZiAoIWVycikKKwkJCWVyciA9IHJldDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRxcHV0X2FsbChzdHJ1Y3QgZHF1b3QgKipkcXVvdCkKK3sKKwl1bnNpZ25lZCBpbnQgY250OworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQorCQlkcXB1dChkcXVvdFtjbnRdKTsKK30KKwogLyogVGhpcyBmdW5jdGlvbiBuZWVkcyBkcV9saXN0X2xvY2sgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGNsZWFyX2RxdW90X2RpcnR5KHN0cnVjdCBkcXVvdCAqZHF1b3QpCiB7CkBAIC0xMjY4LDggKzEyOTIsNyBAQAogb3V0X2VycjoKIAl1cF93cml0ZSgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOwogCS8qIERyb3AgdW51c2VkIHJlZmVyZW5jZXMgKi8KLQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCi0JCWRxcHV0KGdvdFtjbnRdKTsKKwlkcXB1dF9hbGwoZ290KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChkcXVvdF9pbml0aWFsaXplKTsKQEAgLTEyODgsOSArMTMxMSw3IEBACiAJCWlub2RlLT5pX2RxdW90W2NudF0gPSBOVUxMOwogCX0KIAl1cF93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOwotCi0JZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQotCQlkcXB1dChwdXRbY250XSk7CisJZHFwdXRfYWxsKHB1dCk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGRxdW90X2Ryb3ApOwpAQCAtMTMxOSw2ICsxMzQwLDY3IEBACiBFWFBPUlRfU1lNQk9MKHZmc19kcV9kcm9wKTsKIAogLyoKKyAqIGlub2RlX3Jlc2VydmVkX3NwYWNlIGlzIG1hbmFnZWQgaW50ZXJuYWxseSBieSBxdW90YSwgYW5kIHByb3RlY3RlZCBieQorICogaV9sb2NrIHNpbWlsYXIgdG8gaV9ibG9ja3MraV9ieXRlcy4KKyAqLworc3RhdGljIHFzaXplX3QgKmlub2RlX3Jlc2VydmVkX3NwYWNlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCS8qIEZpbGVzeXN0ZW0gbXVzdCBleHBsaWNpdGx5IGRlZmluZSBpdCdzIG93biBtZXRob2QgaW4gb3JkZXIgdG8gdXNlCisJICogcXVvdGEgcmVzZXJ2YXRpb24gaW50ZXJmYWNlICovCisJQlVHX09OKCFpbm9kZS0+aV9zYi0+ZHFfb3AtPmdldF9yZXNlcnZlZF9zcGFjZSk7CisJcmV0dXJuIGlub2RlLT5pX3NiLT5kcV9vcC0+Z2V0X3Jlc2VydmVkX3NwYWNlKGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgaW5vZGVfYWRkX3Jzdl9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBxc2l6ZV90IG51bWJlcikKK3sKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCSppbm9kZV9yZXNlcnZlZF9zcGFjZShpbm9kZSkgKz0gbnVtYmVyOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKK30KKworCitzdGF0aWMgdm9pZCBpbm9kZV9jbGFpbV9yc3Zfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpCit7CisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkqaW5vZGVfcmVzZXJ2ZWRfc3BhY2UoaW5vZGUpIC09IG51bWJlcjsKKwlfX2lub2RlX2FkZF9ieXRlcyhpbm9kZSwgbnVtYmVyKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGlub2RlX3N1Yl9yc3Zfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpCit7CisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkqaW5vZGVfcmVzZXJ2ZWRfc3BhY2UoaW5vZGUpIC09IG51bWJlcjsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Cit9CisKK3N0YXRpYyBxc2l6ZV90IGlub2RlX2dldF9yc3Zfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlxc2l6ZV90IHJldDsKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXJldCA9ICppbm9kZV9yZXNlcnZlZF9zcGFjZShpbm9kZSk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGlub2RlX2luY3Jfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIsCisJCQkJaW50IHJlc2VydmUpCit7CisJaWYgKHJlc2VydmUpCisJCWlub2RlX2FkZF9yc3Zfc3BhY2UoaW5vZGUsIG51bWJlcik7CisJZWxzZQorCQlpbm9kZV9hZGRfYnl0ZXMoaW5vZGUsIG51bWJlcik7Cit9CisKK3N0YXRpYyB2b2lkIGlub2RlX2RlY3Jfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIsIGludCByZXNlcnZlKQoreworCWlmIChyZXNlcnZlKQorCQlpbm9kZV9zdWJfcnN2X3NwYWNlKGlub2RlLCBudW1iZXIpOworCWVsc2UKKwkJaW5vZGVfc3ViX2J5dGVzKGlub2RlLCBudW1iZXIpOworfQorCisvKgogICogRm9sbG93aW5nIGZvdXIgZnVuY3Rpb25zIHVwZGF0ZSBpX2Jsb2NrcytpX2J5dGVzIGZpZWxkcyBhbmQKICAqIHF1b3RhIGluZm9ybWF0aW9uICh0b2dldGhlciB3aXRoIGFwcHJvcHJpYXRlIGNoZWNrcykKICAqIE5PVEU6IFdlIGFic29sdXRlbHkgcmVseSBvbiB0aGUgZmFjdCB0aGF0IGNhbGxlciBkaXJ0aWVzCkBAIC0xMzM2LDYgKzE0MTgsMjEgQEAKIAlpbnQgY250LCByZXQgPSBRVU9UQV9PSzsKIAljaGFyIHdhcm50eXBlW01BWFFVT1RBU107CiAKKwkvKgorCSAqIEZpcnN0IHRlc3QgYmVmb3JlIGFjcXVpcmluZyBtdXRleCAtIHNvbHZlcyBkZWFkbG9ja3Mgd2hlbiB3ZQorCSAqIHJlLWVudGVyIHRoZSBxdW90YSBjb2RlIGFuZCBhcmUgYWxyZWFkeSBob2xkaW5nIHRoZSBtdXRleAorCSAqLworCWlmIChJU19OT1FVT1RBKGlub2RlKSkgeworCQlpbm9kZV9pbmNyX3NwYWNlKGlub2RlLCBudW1iZXIsIHJlc2VydmUpOworCQlnb3RvIG91dDsKKwl9CisKKwlkb3duX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKKwkJaW5vZGVfaW5jcl9zcGFjZShpbm9kZSwgbnVtYmVyLCByZXNlcnZlKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwogCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKIAkJd2FybnR5cGVbY250XSA9IFFVT1RBX05MX05PV0FSTjsKIApAQCAtMTM0Niw3ICsxNDQzLDggQEAKIAkJaWYgKGNoZWNrX2JkcShpbm9kZS0+aV9kcXVvdFtjbnRdLCBudW1iZXIsIHdhcm4sIHdhcm50eXBlK2NudCkKIAkJICAgID09IE5PX1FVT1RBKSB7CiAJCQlyZXQgPSBOT19RVU9UQTsKLQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCQkJZ290byBvdXRfZmx1c2hfd2FybjsKIAkJfQogCX0KIAlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKQEAgLTEzNTcsNjQgKzE0NTUsMjkgQEAKIAkJZWxzZQogCQkJZHF1b3RfaW5jcl9zcGFjZShpbm9kZS0+aV9kcXVvdFtjbnRdLCBudW1iZXIpOwogCX0KLQlpZiAoIXJlc2VydmUpCi0JCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgbnVtYmVyKTsKLW91dF91bmxvY2s6CisJaW5vZGVfaW5jcl9zcGFjZShpbm9kZSwgbnVtYmVyLCByZXNlcnZlKTsKIAlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKworCWlmIChyZXNlcnZlKQorCQlnb3RvIG91dF9mbHVzaF93YXJuOworCW1hcmtfYWxsX2RxdW90X2RpcnR5KGlub2RlLT5pX2RxdW90KTsKK291dF9mbHVzaF93YXJuOgogCWZsdXNoX3dhcm5pbmdzKGlub2RlLT5pX2RxdW90LCB3YXJudHlwZSk7CitvdXRfdW5sb2NrOgorCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCiBpbnQgZHF1b3RfYWxsb2Nfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIsIGludCB3YXJuKQogewotCWludCBjbnQsIHJldCA9IFFVT1RBX09LOwotCi0JLyoKLQkgKiBGaXJzdCB0ZXN0IGJlZm9yZSBhY3F1aXJpbmcgbXV0ZXggLSBzb2x2ZXMgZGVhZGxvY2tzIHdoZW4gd2UKLQkgKiByZS1lbnRlciB0aGUgcXVvdGEgY29kZSBhbmQgYXJlIGFscmVhZHkgaG9sZGluZyB0aGUgbXV0ZXgKLQkgKi8KLQlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKLQkJaW5vZGVfYWRkX2J5dGVzKGlub2RlLCBudW1iZXIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKLQlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKLQkJaW5vZGVfYWRkX2J5dGVzKGlub2RlLCBudW1iZXIpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JcmV0ID0gX19kcXVvdF9hbGxvY19zcGFjZShpbm9kZSwgbnVtYmVyLCB3YXJuLCAwKTsKLQlpZiAocmV0ID09IE5PX1FVT1RBKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQkvKiBEaXJ0aWZ5IGFsbCB0aGUgZHF1b3RzIC0gdGhpcyBjYW4gYmxvY2sgd2hlbiBqb3VybmFsbGluZyAqLwotCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKLQkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0pCi0JCQltYXJrX2RxdW90X2RpcnR5KGlub2RlLT5pX2RxdW90W2NudF0pOwotb3V0X3VubG9jazoKLQl1cF9yZWFkKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gX19kcXVvdF9hbGxvY19zcGFjZShpbm9kZSwgbnVtYmVyLCB3YXJuLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0woZHF1b3RfYWxsb2Nfc3BhY2UpOwogCiBpbnQgZHF1b3RfcmVzZXJ2ZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBxc2l6ZV90IG51bWJlciwgaW50IHdhcm4pCiB7Ci0JaW50IHJldCA9IFFVT1RBX09LOwotCi0JaWYgKElTX05PUVVPVEEoaW5vZGUpKQotCQlnb3RvIG91dDsKLQotCWRvd25fcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOwotCWlmIChJU19OT1FVT1RBKGlub2RlKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JcmV0ID0gX19kcXVvdF9hbGxvY19zcGFjZShpbm9kZSwgbnVtYmVyLCB3YXJuLCAxKTsKLW91dF91bmxvY2s6Ci0JdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOwotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIF9fZHF1b3RfYWxsb2Nfc3BhY2UoaW5vZGUsIG51bWJlciwgd2FybiwgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRxdW90X3Jlc2VydmVfc3BhY2UpOwogCkBAIC0xNDU1LDEwICsxNTE4LDcgQEAKIHdhcm5fcHV0X2FsbDoKIAlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKIAlpZiAocmV0ID09IFFVT1RBX09LKQotCQkvKiBEaXJ0aWZ5IGFsbCB0aGUgZHF1b3RzIC0gdGhpcyBjYW4gYmxvY2sgd2hlbiBqb3VybmFsbGluZyAqLwotCQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCi0JCQlpZiAoaW5vZGUtPmlfZHF1b3RbY250XSkKLQkJCQltYXJrX2RxdW90X2RpcnR5KGlub2RlLT5pX2RxdW90W2NudF0pOworCQltYXJrX2FsbF9kcXVvdF9kaXJ0eShpbm9kZS0+aV9kcXVvdCk7CiAJZmx1c2hfd2FybmluZ3MoaW5vZGUtPmlfZHF1b3QsIHdhcm50eXBlKTsKIAl1cF9yZWFkKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CiAJcmV0dXJuIHJldDsKQEAgLTE0NzEsMTQgKzE1MzEsMTQgQEAKIAlpbnQgcmV0ID0gUVVPVEFfT0s7CiAKIAlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKLQkJaW5vZGVfYWRkX2J5dGVzKGlub2RlLCBudW1iZXIpOworCQlpbm9kZV9jbGFpbV9yc3Zfc3BhY2UoaW5vZGUsIG51bWJlcik7CiAJCWdvdG8gb3V0OwogCX0KIAogCWRvd25fcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOwogCWlmIChJU19OT1FVT1RBKGlub2RlKSkJewogCQl1cF9yZWFkKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7Ci0JCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgbnVtYmVyKTsKKwkJaW5vZGVfY2xhaW1fcnN2X3NwYWNlKGlub2RlLCBudW1iZXIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE0OTAsMTIgKzE1NTAsOSBAQAogCQkJCQkJCW51bWJlcik7CiAJfQogCS8qIFVwZGF0ZSBpbm9kZSBieXRlcyAqLwotCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgbnVtYmVyKTsKKwlpbm9kZV9jbGFpbV9yc3Zfc3BhY2UoaW5vZGUsIG51bWJlcik7CiAJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7Ci0JLyogRGlydGlmeSBhbGwgdGhlIGRxdW90cyAtIHRoaXMgY2FuIGJsb2NrIHdoZW4gam91cm5hbGxpbmcgKi8KLQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCi0JCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdKQotCQkJbWFya19kcXVvdF9kaXJ0eShpbm9kZS0+aV9kcXVvdFtjbnRdKTsKKwltYXJrX2FsbF9kcXVvdF9kaXJ0eShpbm9kZS0+aV9kcXVvdCk7CiAJdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOwogb3V0OgogCXJldHVybiByZXQ7CkBAIC0xNTAzLDM4ICsxNTYwLDkgQEAKIEVYUE9SVF9TWU1CT0woZHF1b3RfY2xhaW1fc3BhY2UpOwogCiAvKgotICogUmVsZWFzZSByZXNlcnZlZCBxdW90YSBzcGFjZQotICovCi12b2lkIGRxdW90X3JlbGVhc2VfcmVzZXJ2ZWRfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpCi17Ci0JaW50IGNudDsKLQotCWlmIChJU19OT1FVT1RBKGlub2RlKSkKLQkJZ290byBvdXQ7Ci0KLQlkb3duX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKLQlpZiAoSVNfTk9RVU9UQShpbm9kZSkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKLQkvKiBSZWxlYXNlIHJlc2VydmVkIGRxdW90cyAqLwotCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgewotCQlpZiAoaW5vZGUtPmlfZHF1b3RbY250XSkKLQkJCWRxdW90X2ZyZWVfcmVzZXJ2ZWRfc3BhY2UoaW5vZGUtPmlfZHF1b3RbY250XSwgbnVtYmVyKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7Ci0KLW91dF91bmxvY2s6Ci0JdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOwotb3V0OgotCXJldHVybjsKLX0KLUVYUE9SVF9TWU1CT0woZHF1b3RfcmVsZWFzZV9yZXNlcnZlZF9zcGFjZSk7Ci0KLS8qCiAgKiBUaGlzIG9wZXJhdGlvbiBjYW4gYmxvY2ssIGJ1dCBvbmx5IGFmdGVyIGV2ZXJ5dGhpbmcgaXMgdXBkYXRlZAogICovCi1pbnQgZHF1b3RfZnJlZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBxc2l6ZV90IG51bWJlcikKK2ludCBfX2RxdW90X2ZyZWVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIsIGludCByZXNlcnZlKQogewogCXVuc2lnbmVkIGludCBjbnQ7CiAJY2hhciB3YXJudHlwZVtNQVhRVU9UQVNdOwpAQCAtMTU0Myw3ICsxNTcxLDcgQEAKICAgICAgICAgICogcmUtZW50ZXIgdGhlIHF1b3RhIGNvZGUgYW5kIGFyZSBhbHJlYWR5IGhvbGRpbmcgdGhlIG11dGV4ICovCiAJaWYgKElTX05PUVVPVEEoaW5vZGUpKSB7CiBvdXRfc3ViOgotCQlpbm9kZV9zdWJfYnl0ZXMoaW5vZGUsIG51bWJlcik7CisJCWlub2RlX2RlY3Jfc3BhY2UoaW5vZGUsIG51bWJlciwgcmVzZXJ2ZSk7CiAJCXJldHVybiBRVU9UQV9PSzsKIAl9CiAKQEAgLTE1NTgsMjEgKzE1ODYsNDAgQEAKIAkJaWYgKCFpbm9kZS0+aV9kcXVvdFtjbnRdKQogCQkJY29udGludWU7CiAJCXdhcm50eXBlW2NudF0gPSBpbmZvX2JkcV9mcmVlKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlcik7Ci0JCWRxdW90X2RlY3Jfc3BhY2UoaW5vZGUtPmlfZHF1b3RbY250XSwgbnVtYmVyKTsKKwkJaWYgKHJlc2VydmUpCisJCQlkcXVvdF9mcmVlX3Jlc2VydmVkX3NwYWNlKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlcik7CisJCWVsc2UKKwkJCWRxdW90X2RlY3Jfc3BhY2UoaW5vZGUtPmlfZHF1b3RbY250XSwgbnVtYmVyKTsKIAl9Ci0JaW5vZGVfc3ViX2J5dGVzKGlub2RlLCBudW1iZXIpOworCWlub2RlX2RlY3Jfc3BhY2UoaW5vZGUsIG51bWJlciwgcmVzZXJ2ZSk7CiAJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7Ci0JLyogRGlydGlmeSBhbGwgdGhlIGRxdW90cyAtIHRoaXMgY2FuIGJsb2NrIHdoZW4gam91cm5hbGxpbmcgKi8KLQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCi0JCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdKQotCQkJbWFya19kcXVvdF9kaXJ0eShpbm9kZS0+aV9kcXVvdFtjbnRdKTsKKworCWlmIChyZXNlcnZlKQorCQlnb3RvIG91dF91bmxvY2s7CisJbWFya19hbGxfZHF1b3RfZGlydHkoaW5vZGUtPmlfZHF1b3QpOworb3V0X3VubG9jazoKIAlmbHVzaF93YXJuaW5ncyhpbm9kZS0+aV9kcXVvdCwgd2FybnR5cGUpOwogCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKIAlyZXR1cm4gUVVPVEFfT0s7CiB9CisKK2ludCBkcXVvdF9mcmVlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHFzaXplX3QgbnVtYmVyKQoreworCXJldHVybiAgX19kcXVvdF9mcmVlX3NwYWNlKGlub2RlLCBudW1iZXIsIDApOworfQogRVhQT1JUX1NZTUJPTChkcXVvdF9mcmVlX3NwYWNlKTsKIAogLyoKKyAqIFJlbGVhc2UgcmVzZXJ2ZWQgcXVvdGEgc3BhY2UKKyAqLwordm9pZCBkcXVvdF9yZWxlYXNlX3Jlc2VydmVkX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHFzaXplX3QgbnVtYmVyKQoreworCV9fZHF1b3RfZnJlZV9zcGFjZShpbm9kZSwgbnVtYmVyLCAxKTsKKworfQorRVhQT1JUX1NZTUJPTChkcXVvdF9yZWxlYXNlX3Jlc2VydmVkX3NwYWNlKTsKKworLyoKICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBibG9jaywgYnV0IG9ubHkgYWZ0ZXIgZXZlcnl0aGluZyBpcyB1cGRhdGVkCiAgKi8KIGludCBkcXVvdF9mcmVlX2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHFzaXplX3QgbnVtYmVyKQpAQCAtMTU5OSwxMCArMTY0Niw3IEBACiAJCWRxdW90X2RlY3JfaW5vZGVzKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlcik7CiAJfQogCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOwotCS8qIERpcnRpZnkgYWxsIHRoZSBkcXVvdHMgLSB0aGlzIGNhbiBibG9jayB3aGVuIGpvdXJuYWxsaW5nICovCi0JZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQotCQlpZiAoaW5vZGUtPmlfZHF1b3RbY250XSkKLQkJCW1hcmtfZHF1b3RfZGlydHkoaW5vZGUtPmlfZHF1b3RbY250XSk7CisJbWFya19hbGxfZHF1b3RfZGlydHkoaW5vZGUtPmlfZHF1b3QpOwogCWZsdXNoX3dhcm5pbmdzKGlub2RlLT5pX2RxdW90LCB3YXJudHlwZSk7CiAJdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOwogCXJldHVybiBRVU9UQV9PSzsKQEAgLTE2MTAsMTkgKzE2NTQsNiBAQAogRVhQT1JUX1NZTUJPTChkcXVvdF9mcmVlX2lub2RlKTsKIAogLyoKLSAqIGNhbGwgYmFjayBmdW5jdGlvbiwgZ2V0IHJlc2VydmVkIHF1b3RhIHNwYWNlIGZyb20gdW5kZXJseWluZyBmcwotICovCi1xc2l6ZV90IGRxdW90X2dldF9yZXNlcnZlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXFzaXplX3QgcmVzZXJ2ZWRfc3BhY2UgPSAwOwotCi0JaWYgKHNiX2FueV9xdW90YV9hY3RpdmUoaW5vZGUtPmlfc2IpICYmCi0JICAgIGlub2RlLT5pX3NiLT5kcV9vcC0+Z2V0X3Jlc2VydmVkX3NwYWNlKQotCQlyZXNlcnZlZF9zcGFjZSA9IGlub2RlLT5pX3NiLT5kcV9vcC0+Z2V0X3Jlc2VydmVkX3NwYWNlKGlub2RlKTsKLQlyZXR1cm4gcmVzZXJ2ZWRfc3BhY2U7Ci19Ci0KLS8qCiAgKiBUcmFuc2ZlciB0aGUgbnVtYmVyIG9mIGlub2RlIGFuZCBibG9ja3MgZnJvbSBvbmUgZGlza3F1b3RhIHRvIGFuIG90aGVyLgogICoKICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBibG9jaywgYnV0IG9ubHkgYWZ0ZXIgZXZlcnl0aGluZyBpcyB1cGRhdGVkCkBAIC0xNjY1LDcgKzE2OTYsNyBAQAogCX0KIAlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CiAJY3VyX3NwYWNlID0gaW5vZGVfZ2V0X2J5dGVzKGlub2RlKTsKLQlyc3Zfc3BhY2UgPSBkcXVvdF9nZXRfcmVzZXJ2ZWRfc3BhY2UoaW5vZGUpOworCXJzdl9zcGFjZSA9IGlub2RlX2dldF9yc3Zfc3BhY2UoaW5vZGUpOwogCXNwYWNlID0gY3VyX3NwYWNlICsgcnN2X3NwYWNlOwogCS8qIEJ1aWxkIHRoZSB0cmFuc2Zlcl9mcm9tIGxpc3QgYW5kIGNoZWNrIHRoZSBsaW1pdHMgKi8KIAlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKQEAgLTE3MDksMjUgKzE3NDAsMTggQEAKIAlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKIAl1cF93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOwogCi0JLyogRGlydGlmeSBhbGwgdGhlIGRxdW90cyAtIHRoaXMgY2FuIGJsb2NrIHdoZW4gam91cm5hbGxpbmcgKi8KLQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKLQkJaWYgKHRyYW5zZmVyX2Zyb21bY250XSkKLQkJCW1hcmtfZHF1b3RfZGlydHkodHJhbnNmZXJfZnJvbVtjbnRdKTsKLQkJaWYgKHRyYW5zZmVyX3RvW2NudF0pIHsKLQkJCW1hcmtfZHF1b3RfZGlydHkodHJhbnNmZXJfdG9bY250XSk7Ci0JCQkvKiBUaGUgcmVmZXJlbmNlIHdlIGdvdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgaW5vZGUgKi8KLQkJCXRyYW5zZmVyX3RvW2NudF0gPSBOVUxMOwotCQl9Ci0JfQorCW1hcmtfYWxsX2RxdW90X2RpcnR5KHRyYW5zZmVyX2Zyb20pOworCW1hcmtfYWxsX2RxdW90X2RpcnR5KHRyYW5zZmVyX3RvKTsKKwkvKiBUaGUgcmVmZXJlbmNlIHdlIGdvdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgaW5vZGUgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCisJCXRyYW5zZmVyX3RvW2NudF0gPSBOVUxMOwogd2Fybl9wdXRfYWxsOgogCWZsdXNoX3dhcm5pbmdzKHRyYW5zZmVyX3RvLCB3YXJudHlwZV90byk7CiAJZmx1c2hfd2FybmluZ3ModHJhbnNmZXJfZnJvbSwgd2FybnR5cGVfZnJvbV9pbm9kZXMpOwogCWZsdXNoX3dhcm5pbmdzKHRyYW5zZmVyX2Zyb20sIHdhcm50eXBlX2Zyb21fc3BhY2UpOwogcHV0X2FsbDoKLQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKLQkJZHFwdXQodHJhbnNmZXJfZnJvbVtjbnRdKTsKLQkJZHFwdXQodHJhbnNmZXJfdG9bY250XSk7Ci0JfQorCWRxcHV0X2FsbCh0cmFuc2Zlcl9mcm9tKTsKKwlkcXB1dF9hbGwodHJhbnNmZXJfdG8pOwogCXJldHVybiByZXQ7CiBvdmVyX3F1b3RhOgogCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvcXVvdGFfdjIuYyBiL2ZzL3F1b3RhL3F1b3RhX3YyLmMKaW5kZXggM2RmYzIzZS4uZTNkYTAyZjQgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhL3F1b3RhX3YyLmMKKysrIGIvZnMvcXVvdGEvcXVvdGFfdjIuYwpAQCAtOTcsOCArOTcsMTEgQEAKIAl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKIAogCWlmICghdjJfcmVhZF9oZWFkZXIoc2IsIHR5cGUsICZkcWhlYWQpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC0xOwogCXZlcnNpb24gPSBsZTMyX3RvX2NwdShkcWhlYWQuZHFoX3ZlcnNpb24pOworCWlmICgoaW5mby0+ZHFpX2ZtdF9pZCA9PSBRRk1UX1ZGU19WMCAmJiB2ZXJzaW9uICE9IDApIHx8CisJICAgIChpbmZvLT5kcWlfZm10X2lkID09IFFGTVRfVkZTX1YxICYmIHZlcnNpb24gIT0gMSkpCisJCXJldHVybiAtMTsKIAogCXNpemUgPSBzYi0+c19vcC0+cXVvdGFfcmVhZChzYiwgdHlwZSwgKGNoYXIgKikmZGluZm8sCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWluZm8pLCBWMl9EUUlORk9PRkYpOwpAQCAtMTIwLDggKzEyMyw4IEBACiAJCWluZm8tPmRxaV9tYXhpbGltaXQgPSAweGZmZmZmZmZmOwogCX0gZWxzZSB7CiAJCS8qIHVzZWQgc3BhY2UgaXMgc3RvcmVkIGFzIHVuc2lnbmVkIDY0LWJpdCB2YWx1ZSAqLwotCQlpbmZvLT5kcWlfbWF4YmxpbWl0ID0gMHhmZmZmZmZmZmZmZmZmZmZmOwkvKiAyXjY0LTEgKi8KLQkJaW5mby0+ZHFpX21heGlsaW1pdCA9IDB4ZmZmZmZmZmZmZmZmZmZmZjsKKwkJaW5mby0+ZHFpX21heGJsaW1pdCA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsJLyogMl42NC0xICovCisJCWluZm8tPmRxaV9tYXhpbGltaXQgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CiAJfQogCWluZm8tPmRxaV9iZ3JhY2UgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfYmdyYWNlKTsKIAlpbmZvLT5kcWlfaWdyYWNlID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2lncmFjZSk7CmRpZmYgLS1naXQgYS9mcy9zdGF0LmMgYi9mcy9zdGF0LmMKaW5kZXggMDc1Njk0ZS4uYzRlY2Q1MiAxMDA2NDQKLS0tIGEvZnMvc3RhdC5jCisrKyBiL2ZzL3N0YXQuYwpAQCAtNDAxLDkgKzQwMSw5IEBACiB9CiAjZW5kaWYgLyogX19BUkNIX1dBTlRfU1RBVDY0ICovCiAKLXZvaWQgaW5vZGVfYWRkX2J5dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBieXRlcykKKy8qIENhbGxlciBpcyBoZXJlIHJlc3BvbnNpYmxlIGZvciBzdWZmaWNpZW50IGxvY2tpbmcgKGllLiBpbm9kZS0+aV9sb2NrKSAqLwordm9pZCBfX2lub2RlX2FkZF9ieXRlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYnl0ZXMpCiB7Ci0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlpbm9kZS0+aV9ibG9ja3MgKz0gYnl0ZXMgPj4gOTsKIAlieXRlcyAmPSA1MTE7CiAJaW5vZGUtPmlfYnl0ZXMgKz0gYnl0ZXM7CkBAIC00MTEsNiArNDExLDEyIEBACiAJCWlub2RlLT5pX2Jsb2NrcysrOwogCQlpbm9kZS0+aV9ieXRlcyAtPSA1MTI7CiAJfQorfQorCit2b2lkIGlub2RlX2FkZF9ieXRlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYnl0ZXMpCit7CisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlfX2lub2RlX2FkZF9ieXRlcyhpbm9kZSwgYnl0ZXMpOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKaW5kZXggMTllYjcwYi4uYWZmMDQ2YiAxMDA2NDQKLS0tIGEvZnMvc3VwZXIuYworKysgYi9mcy9zdXBlci5jCkBAIC05MDEsOCArOTAxLDkgQEAKIAkJCXJldHVybiBlcnJvcjsKIAkJfQogCQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwl9IGVsc2UgeworCQlkb19yZW1vdW50X3NiKHMsIGZsYWdzLCBkYXRhLCAwKTsKIAl9Ci0JZG9fcmVtb3VudF9zYihzLCBmbGFncywgZGF0YSwgMCk7CiAJc2ltcGxlX3NldF9tbnQobW50LCBzKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2Jpbi5jIGIvZnMvc3lzZnMvYmluLmMKaW5kZXggNjBjNzAyYi4uYTBhNTAwYSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvYmluLmMKKysrIGIvZnMvc3lzZnMvYmluLmMKQEAgLTQ4Myw3ICs0ODMsOCBAQAogICoJQGF0dHI6CWF0dHJpYnV0ZSBkZXNjcmlwdG9yLgogICovCiAKLWludCBzeXNmc19jcmVhdGVfYmluX2ZpbGUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIpCitpbnQgc3lzZnNfY3JlYXRlX2Jpbl9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICBjb25zdCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cikKIHsKIAlCVUdfT04oIWtvYmogfHwgIWtvYmotPnNkIHx8ICFhdHRyKTsKIApAQCAtNDk3LDcgKzQ5OCw4IEBACiAgKglAYXR0cjoJYXR0cmlidXRlIGRlc2NyaXB0b3IuCiAgKi8KIAotdm9pZCBzeXNmc19yZW1vdmVfYmluX2ZpbGUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIpCit2b2lkIHN5c2ZzX3JlbW92ZV9iaW5fZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyKQogewogCXN5c2ZzX2hhc2hfYW5kX3JlbW92ZShrb2JqLT5zZCwgYXR0ci0+YXR0ci5uYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IDJhNzNkOWIuLmE2Mjc5OWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMTY2LDkgKzE2Niw5IEBACiAJX19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZHJpdmVyX2NyZWF0ZV9maWxlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXIsCi0JCQkJCSAgIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlICphdHRyKTsKKwkJCQkJY29uc3Qgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKmF0dHIpOwogZXh0ZXJuIHZvaWQgZHJpdmVyX3JlbW92ZV9maWxlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXIsCi0JCQkgICAgICAgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKmF0dHIpOworCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlICphdHRyKTsKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZHJpdmVyX2FkZF9rb2JqKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCiAJCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLApAQCAtMzE5LDEzICszMTksMTMgQEAKIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyXyMjX25hbWUgPSBfX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQogCiBleHRlcm4gaW50IF9fbXVzdF9jaGVjayBkZXZpY2VfY3JlYXRlX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2aWNlLAotCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZW50cnkpOworCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZW50cnkpOwogZXh0ZXJuIHZvaWQgZGV2aWNlX3JlbW92ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cik7CisJCQkgICAgICAgY29uc3Qgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpOwogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cik7CisJCQkJCWNvbnN0IHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyKTsKIGV4dGVybiB2b2lkIGRldmljZV9yZW1vdmVfYmluX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyKTsKKwkJCQkgICBjb25zdCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cik7CiBleHRlcm4gaW50IGRldmljZV9zY2hlZHVsZV9jYWxsYmFja19vd25lcihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXZvaWQgKCpmdW5jKShzdHJ1Y3QgZGV2aWNlICpkZXYpLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHN0LmggYi9pbmNsdWRlL2xpbnV4L2RzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjZmZWQ4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvZHN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyoKLSAqIDIwMDcrIENvcHlyaWdodCAoYykgRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19EU1RfSAotI2RlZmluZSBfX0RTVF9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Nvbm5lY3Rvci5oPgotCi0jZGVmaW5lIERTVF9OQU1FTEVOCQkzMgotI2RlZmluZSBEU1RfTkFNRQkJImRzdCIKLQotZW51bSB7Ci0JLyogUmVtb3ZlIG5vZGUgd2l0aCBnaXZlbiBpZCBmcm9tIHN0b3JhZ2UgKi8KLQlEU1RfREVMX05PREUJPSAwLAotCS8qIEFkZCByZW1vdGUgbm9kZSB3aXRoIGdpdmVuIGlkIHRvIHRoZSBzdG9yYWdlICovCi0JRFNUX0FERF9SRU1PVEUsCi0JLyogQWRkIGxvY2FsIG5vZGUgd2l0aCBnaXZlbiBpZCB0byB0aGUgc3RvcmFnZSB0byBiZSBleHBvcnRlZCBhbmQgdXNlZCBieSByZW1vdGUgcGVlcnMgKi8KLQlEU1RfQUREX0VYUE9SVCwKLQkvKiBDcnlwdG8gaW5pdGlhbGl6YXRpb24gY29tbWFuZCAoaGFzaC9jaXBoZXIgdXNlZCB0byBwcm90ZWN0IHRoZSBjb25uZWN0aW9uKSAqLwotCURTVF9DUllQVE8sCi0JLyogU2VjdXJpdHkgYXR0cmlidXRlcyBmb3IgZ2l2ZW4gY29ubmVjdGlvbiAocGVybWlzc2lvbnMgZm9yIGV4YW1wbGUpICovCi0JRFNUX1NFQ1VSSVRZLAotCS8qIFJlZ2lzdGVyIGdpdmVuIG5vZGUgaW4gdGhlIGJsb2NrIGxheWVyIHN1YnN5c3RlbSAqLwotCURTVF9TVEFSVCwKLQlEU1RfQ01EX01BWAotfTsKLQotc3RydWN0IGRzdF9jdGwKLXsKLQkvKiBTdG9yYWdlIG5hbWUgKi8KLQljaGFyCQkJbmFtZVtEU1RfTkFNRUxFTl07Ci0JLyogQ29tbWFuZCBmbGFncyAqLwotCV9fdTMyCQkJZmxhZ3M7Ci0JLyogQ29tbWFuZCBpdHNlbGYgKHNlZSBhYm92ZSkgKi8KLQlfX3UzMgkJCWNtZDsKLQkvKiBNYXhpbXVtIG51bWJlciBvZiBwYWdlcyBwZXIgc2luZ2xlIHJlcXVlc3QgaW4gdGhpcyBkZXZpY2UgKi8KLQlfX3UzMgkJCW1heF9wYWdlczsKLQkvKiBTdGFsZS9lcnJvciB0cmFuc2FjdGlvbiBzY2FubmluZyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLwotCV9fdTMyCQkJdHJhbnNfc2Nhbl90aW1lb3V0OwotCS8qIE1heGltdW0gbnVtYmVyIG9mIHJldHJ5IHNlbmRzIGJlZm9yZSBjb21wbGV0aW5nIHRyYW5zYWN0aW9uIGFzIGJyb2tlbiAqLwotCV9fdTMyCQkJdHJhbnNfbWF4X3JldHJpZXM7Ci0JLyogU3RvcmFnZSBzaXplICovCi0JX191NjQJCQlzaXplOwotfTsKLQotLyogUmVwbHkgY29tbWFuZCBjYXJyaWVzIGNvbXBsZXRpb24gc3RhdHVzICovCi1zdHJ1Y3QgZHN0X2N0bF9hY2sKLXsKLQlzdHJ1Y3QgY25fbXNnCQltc2c7Ci0JaW50CQkJZXJyb3I7Ci0JaW50CQkJdW51c2VkWzNdOwotfTsKLQotLyoKLSAqIFVuZm9ydHVuYWx0ZWx5IHNvY2tldCBhZGRyZXNzIHN0cnVjdHVyZSBpcyBub3QgZXhwb3J0ZWQgdG8gdXNlcnNwYWNlCi0gKiBhbmQgaXMgcmVkZWZpbmVkIHRoZXJlLgotICovCi0jZGVmaW5lIFNBRERSX01BWF9EQVRBCTEyOAotCi1zdHJ1Y3Qgc2FkZHIgewotCS8qIGFkZHJlc3MgZmFtaWx5LCBBRl94eHgJKi8KLQl1bnNpZ25lZCBzaG9ydAkJc2FfZmFtaWx5OwotCS8qIDE0IGJ5dGVzIG9mIHByb3RvY29sIGFkZHJlc3MJKi8KLQljaGFyCQkJc2FfZGF0YVtTQUREUl9NQVhfREFUQV07Ci0JLyogTnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gc2FfZGF0YSAqLwotCXVuc2lnbmVkIHNob3J0CQlzYV9kYXRhX2xlbjsKLX07Ci0KLS8qIEFkZHJlc3Mgc3RydWN0dXJlICovCi1zdHJ1Y3QgZHN0X25ldHdvcmtfY3RsCi17Ci0JLyogU29ja2V0IHR5cGU6IGRhdGFncmFtLCBzdHJlYW0uLi4qLwotCXVuc2lnbmVkIGludAkJdHlwZTsKLQkvKiBMZXQgbWUgZ3Vlc3MsIGlzIGl0IGEgSnVwaXRlciBkaWFtZXRlcj8gKi8KLQl1bnNpZ25lZCBpbnQJCXByb3RvOwotCS8qIFBlZXIncyBhZGRyZXNzICovCi0Jc3RydWN0IHNhZGRyCQlhZGRyOwotfTsKLQotc3RydWN0IGRzdF9jcnlwdG9fY3RsCi17Ci0JLyogQ2lwaGVyIGFuZCBoYXNoIG5hbWVzICovCi0JY2hhcgkJCWNpcGhlcl9hbGdvW0RTVF9OQU1FTEVOXTsKLQljaGFyCQkJaGFzaF9hbGdvW0RTVF9OQU1FTEVOXTsKLQotCS8qIEtleSBzaXplcy4gQ2FuIGJlIHplcm8gZm9yIGRpZ2VzdCBmb3IgZXhhbXBsZSAqLwotCXVuc2lnbmVkIGludAkJY2lwaGVyX2tleXNpemUsIGhhc2hfa2V5c2l6ZTsKLQkvKiBBbGlnbm1lbnQuIENhbGN1bGF0ZWQgYnkgdGhlIERTVCBpdHNlbGYuICovCi0JdW5zaWduZWQgaW50CQljcnlwdG9fYXR0YWNoZWRfc2l6ZTsKLQkvKiBOdW1iZXIgb2YgdGhyZWFkcyB0byBwZXJmb3JtIGNyeXB0byBvcGVyYXRpb25zICovCi0JaW50CQkJdGhyZWFkX251bTsKLX07Ci0KLS8qIEV4cG9ydCBzZWN1cml0eSBhdHRyaWJ1dGVzIGhhdmUgdGhpcyBiaXRzIGNoZWNrZWQgaW4gd2hlbiBjbGllbnQgY29ubmVjdHMgKi8KLSNkZWZpbmUgRFNUX1BFUk1fUkVBRAkJKDE8PDApCi0jZGVmaW5lIERTVF9QRVJNX1dSSVRFCQkoMTw8MSkKLQotLyoKLSAqIFJpZ2h0IG5vdyBpdCBpcyBzaW1wbGUgbW9kZWwsIHdoZXJlIGVhY2ggcmVtb3RlIGFkZHJlc3MKLSAqIGlzIGFzc2lnbmVkIHRvIHNldCBvZiBwZXJtaXNzaW9ucyBpdCBpcyBhbGxvd2VkIHRvIHBlcmZvcm0uCi0gKiBJbiByZWFsIHdvcmxkIGJsb2NrIGRldmljZSBkb2VzIG5vdCBrbm93IGFueXRoaW5nIGJ1dAotICogcmVhZGluZyBhbmQgd3JpdGluZywgc28gaXQgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2guCi0gKi8KLXN0cnVjdCBkc3Rfc2VjdXJlX3VzZXIKLXsKLQl1bnNpZ25lZCBpbnQJCXBlcm1pc3Npb25zOwotCXN0cnVjdCBzYWRkcgkJYWRkcjsKLX07Ci0KLS8qCi0gKiBFeHBvcnQgY29udHJvbCBjb21tYW5kOiBkZXZpY2UgdG8gZXhwb3J0IGFuZCBuZXR3b3JrIGFkZHJlc3MgdG8gYWNjZXB0Ci0gKiBjbGllbnRzIHRvIHdvcmsgd2l0aCBnaXZlbiBkZXZpY2UKLSAqLwotc3RydWN0IGRzdF9leHBvcnRfY3RsCi17Ci0JY2hhcgkJCWRldmljZVtEU1RfTkFNRUxFTl07Ci0Jc3RydWN0IGRzdF9uZXR3b3JrX2N0bAljdGw7Ci19OwotCi1lbnVtIHsKLQlEU1RfQ0ZHCT0gMSwgCQkvKiBSZXF1ZXN0IHJlbW90ZSBjb25maWd1cmF0aW9uICovCi0JRFNUX0lPLAkJCS8qIElPIGNvbW1hbmQgKi8KLQlEU1RfSU9fUkVTUE9OU0UsCS8qIElPIHJlc3BvbnNlICovCi0JRFNUX1BJTkcsCQkvKiBLZWVwYWxpdmUgbWVzc2FnZSAqLwotCURTVF9OQ01EX01BWCwKLX07Ci0KLXN0cnVjdCBkc3RfY21kCi17Ci0JLyogTmV0d29yayBjb21tYW5kIGl0c2VsZiwgc2VlIGFib3ZlICovCi0JX191MzIJCQljbWQ7Ci0JLyoKLQkgKiBTaXplIG9mIHRoZSBhdHRhY2hlZCBkYXRhCi0JICogKGluIG1vc3QgY2FzZXMsIGZvciBSRUFEIGNvbW1hbmQgaXQgbWVhbnMgaG93IG1hbnkgYnl0ZXMgd2VyZSByZXF1ZXN0ZWQpCi0JICovCi0JX191MzIJCQlzaXplOwotCS8qIENyeXB0byBzaXplOiBudW1iZXIgb2YgYXR0YWNoZWQgYnl0ZXMgd2l0aCBkaWdlc3QvaG1hYyAqLwotCV9fdTMyCQkJY3NpemU7Ci0JLyogSGVyZSB3ZSBjYW4gY2Fycnkgc2VjcmV0IGRhdGEgKi8KLQlfX3UzMgkJCXJlc2VydmVkOwotCS8qIFJlYWQvd3JpdGUgYml0cywgc2VlIGhvdyB0aGV5IGFyZSBlbmNvZGVkIGluIGJpbyBzdHJ1Y3R1cmUgKi8KLQlfX3U2NAkJCXJ3OwotCS8qIEJJTyBmbGFncyAqLwotCV9fdTY0CQkJZmxhZ3M7Ci0JLyogVW5pcXVlIGNvbW1hbmQgaWQgKGxpa2UgdHJhbnNhY3Rpb24gSUQpICovCi0JX191NjQJCQlpZDsKLQkvKiBTZWN0b3IgdG8gc3RhcnQgSU8gZnJvbSAqLwotCV9fdTY0CQkJc2VjdG9yOwotCS8qIEhhc2ggZGF0YSBpcyBwbGFjZWQgYWZ0ZXIgdGhpcyBoZWFkZXIgKi8KLQlfX3U4CQkJaGFzaFswXTsKLX07Ci0KLS8qCi0gKiBDb252ZXJ0IGNvbW1hbmQgdG8vZnJvbSBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gKiBXZSBkbyBub3QgdXNlIGh0b24qKCkgZnVuY3Rpb25zLCBzaW5jZSB0aGVyZSBpcwotICogbm8gNjQtYml0IGltcGxlbWVudGF0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZHN0X2NvbnZlcnRfY21kKHN0cnVjdCBkc3RfY21kICpjKQotewotCWMtPmNtZCA9IF9fY3B1X3RvX2JlMzIoYy0+Y21kKTsKLQljLT5jc2l6ZSA9IF9fY3B1X3RvX2JlMzIoYy0+Y3NpemUpOwotCWMtPnNpemUgPSBfX2NwdV90b19iZTMyKGMtPnNpemUpOwotCWMtPnNlY3RvciA9IF9fY3B1X3RvX2JlNjQoYy0+c2VjdG9yKTsKLQljLT5pZCA9IF9fY3B1X3RvX2JlNjQoYy0+aWQpOwotCWMtPmZsYWdzID0gX19jcHVfdG9fYmU2NChjLT5mbGFncyk7Ci0JYy0+cncgPSBfX2NwdV90b19iZTY0KGMtPnJ3KTsKLX0KLQotLyogVHJhbnNhY3Rpb24gaWQgKi8KLXR5cGVkZWYgX191NjQgZHN0X2dlbl90OwotCi0jaWZkZWYgX19LRVJORUxfXwotCi0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvYmlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldC5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KLQotI2lmZGVmIENPTkZJR19EU1RfREVCVUcKLSNkZWZpbmUgZHByaW50ayhmLCBhLi4uKSBwcmludGsoS0VSTl9OT1RJQ0UgZiwgIyNhKQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkKLQlkcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7fQotI2VuZGlmCi0KLXN0cnVjdCBkc3Rfbm9kZTsKLQotc3RydWN0IGRzdF90cmFucwotewotCS8qIERTVCBub2RlIHdlIGFyZSB3b3JraW5nIHdpdGggKi8KLQlzdHJ1Y3QgZHN0X25vZGUJCSpuOwotCi0JLyogRW50cnkgaW5zaWRlIHRyYW5zYWN0aW9uIHRyZWUgKi8KLQlzdHJ1Y3QgcmJfbm9kZQkJdHJhbnNfZW50cnk7Ci0KLQkvKiBNZXJsaW4ga2lsbHMgdGhpcyB0cmFuc2FjdGlvbiB3aGVuIHRoaXMgbWVtb3J5IGNlbGwgZXF1YWxzIHplcm8gKi8KLQlhdG9taWNfdAkJcmVmY250OwotCi0JLyogSG93IHRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBieSBjcnlwdG8gZW5naW5lICovCi0Jc2hvcnQJCQllbmM7Ci0JLyogSG93IG1hbnkgdGltZXMgdGhpcyB0cmFuc2FjdGlvbiB3YXMgcmVzZW50ICovCi0Jc2hvcnQJCQlyZXRyaWVzOwotCS8qIENvbXBsZXRpb24gc3RhdHVzICovCi0JaW50CQkJZXJyb3I7Ci0KLQkvKiBXaGVuIGRpZCB3ZSBzZW5kIGl0IHRvIHRoZSByZW1vdGUgcGVlciAqLwotCWxvbmcJCQlzZW5kX3RpbWU7Ci0KLQkvKiBNeSBuYW1lIGlzLi4uCi0JICogV2VsbCwgY29tcHV0ZXJzIGRvZXMgbm90IHNwZWFrLCB0aGV5IGhhdmUgdW5pcXVlIGlkIGluc3RlYWQgKi8KLQlkc3RfZ2VuX3QJCWdlbjsKLQotCS8qIEJsb2NrIElPIHdlIGFyZSB3b3JraW5nIHdpdGggKi8KLQlzdHJ1Y3QgYmlvCQkqYmlvOwotCi0JLyogTmV0d29yayBjb21tYW5kIGZvciBhYm92ZSBibG9jayBJTyByZXF1ZXN0ICovCi0Jc3RydWN0IGRzdF9jbWQJCWNtZDsKLX07Ci0KLXN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZQotewotCS8qIFdoYXQgc2hvdWxkIHdlIGRvIHdpdGggYWxsIGJsb2NrIHJlcXVlc3RzICovCi0Jc3RydWN0IGNyeXB0b19oYXNoCSpoYXNoOwotCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlcgkqY2lwaGVyOwotCi0JLyogUG9vbCBvZiBwYWdlcyB1c2VkIHRvIGVuY3J5cHQgZGF0YSBpbnRvIGJlZm9yZSBzZW5kaW5nICovCi0JaW50CQkJcGFnZV9udW07Ci0Jc3RydWN0IHBhZ2UJCSoqcGFnZXM7Ci0KLQkvKiBXaGF0IHRvIGRvIHdpdGggY3VycmVudCByZXF1ZXN0ICovCi0JaW50CQkJZW5jOwotCS8qIFdobyB3ZSBhcmUgYW5kIHdoZXJlIGRvIHdlIGdvICovCi0Jc3RydWN0IHNjYXR0ZXJsaXN0CSpzcmMsICpkc3Q7Ci0KLQkvKiBNYXhpbXVtIHRpbWVvdXQgd2FpdGluZyBmb3IgZW5jcnlwdGlvbiB0byBiZSBjb21wbGV0ZWQgKi8KLQlsb25nCQkJdGltZW91dDsKLQkvKiBJViBpcyBhIDY0LWJpdCBzZXF1ZW50aWFsIGNvdW50ZXIgKi8KLQl1NjQJCQlpdjsKLQotCS8qIFNlY3JldCBkYXRhICovCi0Jdm9pZAkJCSpwcml2YXRlOwotCi0JLyogQ2FjaGVkIHRlbXBvcmFyeSBkYXRhIGxpdmVzIGhlcmUgKi8KLQlpbnQJCQlzaXplOwotCXZvaWQJCQkqZGF0YTsKLX07Ci0KLXN0cnVjdCBkc3Rfc3RhdGUKLXsKLQkvKiBUaGUgbWFpbiBzdGF0ZSBwcm90ZWN0aW9uICovCi0Jc3RydWN0IG11dGV4CQlzdGF0ZV9sb2NrOwotCi0JLyogUG9sbGluZyBtYWNoaW5lcnkgZm9yIHNvY2tldHMgKi8KLQl3YWl0X3F1ZXVlX3QgCQl3YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IAkqd2hlYWQ7Ci0JLyogTW9zdCBvZiBldmVudHMgYXJlIGJlaW5nIHdhaXRlZCBoZXJlICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgCXRocmVhZF93YWl0OwotCi0JLyogV2hvIG93bnMgdGhpcz8gKi8KLQlzdHJ1Y3QgZHN0X25vZGUJCSpub2RlOwotCi0JLyogTmV0d29yayBhZGRyZXNzIGZvciB0aGlzIHN0YXRlICovCi0Jc3RydWN0IGRzdF9uZXR3b3JrX2N0bAljdGw7Ci0KLQkvKiBQZXJtaXNzaW9ucyB0byB3b3JrIHdpdGg6IHJlYWQtb25seSBvciBydyBjb25uZWN0aW9uICovCi0JdTMyCQkJcGVybWlzc2lvbnM7Ci0KLQkvKiBDYWxsZWQgd2hlbiB3ZSBuZWVkIHRvIGNsZWFuIHByaXZhdGUgZGF0YSAqLwotCXZvaWQJCQkoKiBjbGVhbnVwKShzdHJ1Y3QgZHN0X3N0YXRlICpzdCk7Ci0KLQkvKiBVc2VkIGJ5IHRoZSBzZXJ2ZXI6IEJJTyBjb21wbGV0aW9uIHF1ZXVlcyBCSU9zIGhlcmUgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXJlcXVlc3RfbGlzdDsKLQlzcGlubG9ja190CQlyZXF1ZXN0X2xvY2s7Ci0KLQkvKiBHdWVzcyB3aGF0PyBObywgaXQgaXMgbm90IG51bWJlciBvZiBwbGFuZXRzICovCi0JYXRvbWljX3QJCXJlZmNudDsKLQotCS8qIFRoaXMgZmxhZ3MgaXMgc2V0IHdoZW4gY29ubmVjdGlvbiBzaG91bGQgYmUgZHJvcHBlZCAqLwotCWludAkJCW5lZWRfZXhpdDsKLQotCS8qCi0JICogU29ja2V0IHRvIHdvcmsgd2l0aC4gU2Vjb25kIHBvaW50ZXIgaXMgdXNlZCBmb3IKLQkgKiBsb2NrbGVzcyBjaGVjayBpZiBzb2NrZXQgd2FzIGNoYW5nZWQgYmVmb3JlIHBlcmZvcm1pbmcKLQkgKiBuZXh0IGFjdGlvbiAobGlrZSB3b3JraW5nIHdpdGggY2FjaGVkIHBvbGxpbmcgcmVzdWx0KQotCSAqLwotCXN0cnVjdCBzb2NrZXQJCSpzb2NrZXQsICpyZWFkX3NvY2tldDsKLQotCS8qIENhY2hlZCBwcmVhbGxvY2F0ZWQgZGF0YSAqLwotCXZvaWQJCQkqZGF0YTsKLQl1bnNpZ25lZCBpbnQJCXNpemU7Ci0KLQkvKiBDdXJyZW50bHkgcHJvY2Vzc2VkIGNvbW1hbmQgKi8KLQlzdHJ1Y3QgZHN0X2NtZAkJY21kOwotfTsKLQotc3RydWN0IGRzdF9pbmZvCi17Ci0JLyogRGV2aWNlIHNpemUgKi8KLQl1NjQJCQlzaXplOwotCi0JLyogTG9jYWwgZGV2aWNlIG5hbWUgZm9yIGV4cG9ydCBkZXZpY2VzICovCi0JY2hhcgkJCWxvY2FsW0RTVF9OQU1FTEVOXTsKLQotCS8qIE5ldHdvcmsgc2V0dXAgKi8KLQlzdHJ1Y3QgZHN0X25ldHdvcmtfY3RsCW5ldDsKLQotCS8qIFN5c2ZzIGJpdHMgdXNlIHRoaXMgKi8KLQlzdHJ1Y3QgZGV2aWNlCQlkZXZpY2U7Ci19OwotCi1zdHJ1Y3QgZHN0X25vZGUKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGVfZW50cnk7Ci0KLQkvKiBIaSwgbXkgbmFtZSBpcyBzdG9yZWQgaGVyZSAqLwotCWNoYXIJCQluYW1lW0RTVF9OQU1FTEVOXTsKLQkvKiBNeSBjYWNoZSBuYW1lIGlzIHN0b3JlZCBoZXJlICovCi0JY2hhcgkJCWNhY2hlX25hbWVbRFNUX05BTUVMRU5dOwotCi0JLyogQmxvY2sgZGV2aWNlIGF0dGFjaGVkIHRvIGdpdmVuIG5vZGUuCi0JICogT25seSB2YWxpZCBmb3IgZXhwb3J0aW5nIG5vZGVzICovCi0Jc3RydWN0IGJsb2NrX2RldmljZSAJKmJkZXY7Ci0JLyogTmV0d29yayBzdGF0ZSBtYWNoaW5lIGZvciBnaXZlbiBwZWVyICovCi0Jc3RydWN0IGRzdF9zdGF0ZQkqc3RhdGU7Ci0KLQkvKiBCbG9jayBJTyBtYWNoaW5lcnkgKi8KLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZQkqcXVldWU7Ci0Jc3RydWN0IGdlbmRpc2sJCSpkaXNrOwotCi0JLyogTnVtYmVyIG9mIHRocmVhZHMgaW4gcHJvY2Vzc2luZyBwb29sICovCi0JaW50CQkJdGhyZWFkX251bTsKLQkvKiBNYXhpbXVtIG51bWJlciBvZiBwYWdlcyBpbiBzaW5nbGUgSU8gKi8KLQlpbnQJCQltYXhfcGFnZXM7Ci0KLQkvKiBJJ20gdGhhdCBiaWcgaW4gYnl0ZXMgKi8KLQlsb2ZmX3QJCQlzaXplOwotCi0JLyogRXhwb3J0ZWQgdG8gdXNlcnNwYWNlIG5vZGUgaW5mb3JtYXRpb24gKi8KLQlzdHJ1Y3QgZHN0X2luZm8JCSppbmZvOwotCi0JLyoKLQkgKiBTZWN1cml0eSBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBVc2VkIG9ubHkgYnkgZXhwb3J0aW5nIG5vZGUgY3VycmVudGx5LgotCSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJc2VjdXJpdHlfbGlzdDsKLQlzdHJ1Y3QgbXV0ZXgJCXNlY3VyaXR5X2xvY2s7Ci0KLQkvKgotCSAqIFdoZW4gdGhpcyB1bmVyZmxvd3MgYmVsb3cgemVybywgdW5pdmVyc2l0eSBjb2xsYXBzZXMuCi0JICogQnV0IHRoaXMgd2lsbCBub3QgaGFwcGVuLCBzaW5jZSBub2RlIHdpbGwgYmUgZnJlZWQsCi0JICogd2hlbiByZWZlcmVuY2UgY291bnRlciByZWFjaGVzIHplcm8uCi0JICovCi0JYXRvbWljX3QJCXJlZmNudDsKLQotCS8qIEhvdyBwcmVjaXNlbHkgc2hvdWxkIEkgYmUgc3RhcnRlZD8gKi8KLQlpbnQgCQkJKCpzdGFydCkoc3RydWN0IGRzdF9ub2RlICopOwotCi0JLyogQ3J5cHRvIGNhcGFiaWxpdGllcyAqLwotCXN0cnVjdCBkc3RfY3J5cHRvX2N0bAljcnlwdG87Ci0JdTgJCQkqaGFzaF9rZXk7Ci0JdTgJCQkqY2lwaGVyX2tleTsKLQotCS8qIFBvb2wgb2YgcHJvY2Vzc2luZyB0aHJlYWQgKi8KLQlzdHJ1Y3QgdGhyZWFkX3Bvb2wJKnBvb2w7Ci0KLQkvKiBUcmFuc2FjdGlvbiBJRHMgbGl2ZSBoZXJlICovCi0JYXRvbWljX2xvbmdfdAkJZ2VuOwotCi0JLyoKLQkgKiBIb3cgZnJlcXVlbnRseSBhbmQgaG93IG1hbnkgdGltZXMgdHJhbnNhY3Rpb24KLQkgKiB0cmVlIHNob3VsZCBiZSBzY2FubmVkIHRvIGRyb3Agc3RhbGUgb2JqZWN0cy4KLQkgKi8KLQlsb25nCQkJdHJhbnNfc2Nhbl90aW1lb3V0OwotCWludAkJCXRyYW5zX21heF9yZXRyaWVzOwotCi0JLyogU21hbGwgZ25vbWVzIGxpdmUgaGVyZSAqLwotCXN0cnVjdCByYl9yb290CQl0cmFuc19yb290OwotCXN0cnVjdCBtdXRleAkJdHJhbnNfbG9jazsKLQotCS8qCi0JICogVHJhbnNhY3Rpb24gY2FjaGUvbWVtb3J5IHBvb2wuCi0JICogSXQgaXMgYmlnIGVub3VnaCB0byBjb250YWluIG5vdCBvbmx5IHRyYW5zYWN0aW9uCi0JICogaXRzZWxmLCBidXQgYWRkaXRpb25hbCBjcnlwdG8gZGF0YSAoZGlnZXN0L2htYWMpLgotCSAqLwotCXN0cnVjdCBrbWVtX2NhY2hlCSp0cmFuc19jYWNoZTsKLQltZW1wb29sX3QJCSp0cmFuc19wb29sOwotCi0JLyogVGhpcyBlbnRpdHkgc2NhbnMgdHJhbnNhY3Rpb24gdHJlZSAqLwotCXN0cnVjdCBkZWxheWVkX3dvcmsgCXRyYW5zX3dvcms7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwotfTsKLQotLyogS2VybmVsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN1cml0eSBhdHRyaWJ1dGUgKi8KLXN0cnVjdCBkc3Rfc2VjdXJlCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAlzZWNfZW50cnk7Ci0Jc3RydWN0IGRzdF9zZWN1cmVfdXNlcglzZWM7Ci19OwotCi1pbnQgZHN0X3Byb2Nlc3NfYmlvKHN0cnVjdCBkc3Rfbm9kZSAqbiwgc3RydWN0IGJpbyAqYmlvKTsKLQotaW50IGRzdF9ub2RlX2luaXRfY29ubmVjdGVkKHN0cnVjdCBkc3Rfbm9kZSAqbiwgc3RydWN0IGRzdF9uZXR3b3JrX2N0bCAqcik7Ci1pbnQgZHN0X25vZGVfaW5pdF9saXN0ZW5lZChzdHJ1Y3QgZHN0X25vZGUgKm4sIHN0cnVjdCBkc3RfZXhwb3J0X2N0bCAqbGUpOwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkc3Rfc3RhdGUgKmRzdF9zdGF0ZV9nZXQoc3RydWN0IGRzdF9zdGF0ZSAqc3QpCi17Ci0JQlVHX09OKGF0b21pY19yZWFkKCZzdC0+cmVmY250KSA9PSAwKTsKLQlhdG9taWNfaW5jKCZzdC0+cmVmY250KTsKLQlyZXR1cm4gc3Q7Ci19Ci0KLXZvaWQgZHN0X3N0YXRlX3B1dChzdHJ1Y3QgZHN0X3N0YXRlICpzdCk7Ci0KLXN0cnVjdCBkc3Rfc3RhdGUgKmRzdF9zdGF0ZV9hbGxvYyhzdHJ1Y3QgZHN0X25vZGUgKm4pOwotaW50IGRzdF9zdGF0ZV9zb2NrZXRfY3JlYXRlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0KTsKLXZvaWQgZHN0X3N0YXRlX3NvY2tldF9yZWxlYXNlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0KTsKLQotdm9pZCBkc3Rfc3RhdGVfZXhpdF9jb25uZWN0ZWQoc3RydWN0IGRzdF9zdGF0ZSAqc3QpOwotCi1pbnQgZHN0X3N0YXRlX3NjaGVkdWxlX3JlY2VpdmVyKHN0cnVjdCBkc3Rfc3RhdGUgKnN0KTsKLQotdm9pZCBkc3RfZHVtcF9hZGRyKHN0cnVjdCBzb2NrZXQgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBjaGFyICpzdHIpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHN0X3N0YXRlX2xvY2soc3RydWN0IGRzdF9zdGF0ZSAqc3QpCi17Ci0JbXV0ZXhfbG9jaygmc3QtPnN0YXRlX2xvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHN0X3N0YXRlX3VubG9jayhzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKLXsKLQltdXRleF91bmxvY2soJnN0LT5zdGF0ZV9sb2NrKTsKLX0KLQotdm9pZCBkc3RfcG9sbF9leGl0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0KTsKLWludCBkc3RfcG9sbF9pbml0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0KTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZHN0X3N0YXRlX3BvbGwoc3RydWN0IGRzdF9zdGF0ZSAqc3QpCi17Ci0JdW5zaWduZWQgaW50IHJldmVudHMgPSBQT0xMSFVQIHwgUE9MTEVSUjsKLQotCWRzdF9zdGF0ZV9sb2NrKHN0KTsKLQlpZiAoc3QtPnNvY2tldCkKLQkJcmV2ZW50cyA9IHN0LT5zb2NrZXQtPm9wcy0+cG9sbChOVUxMLCBzdC0+c29ja2V0LCBOVUxMKTsKLQlkc3Rfc3RhdGVfdW5sb2NrKHN0KTsKLQotCXJldHVybiByZXZlbnRzOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkc3RfdGhyZWFkX3NldHVwKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZHN0X25vZGVfcHV0KHN0cnVjdCBkc3Rfbm9kZSAqbik7Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRzdF9ub2RlICpkc3Rfbm9kZV9nZXQoc3RydWN0IGRzdF9ub2RlICpuKQotewotCWF0b21pY19pbmMoJm4tPnJlZmNudCk7Ci0JcmV0dXJuIG47Ci19Ci0KLWludCBkc3RfZGF0YV9yZWN2KHN0cnVjdCBkc3Rfc3RhdGUgKnN0LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSk7Ci1pbnQgZHN0X3JlY3ZfY2RhdGEoc3RydWN0IGRzdF9zdGF0ZSAqc3QsIHZvaWQgKmNkYXRhKTsKLWludCBkc3RfZGF0YV9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IG1vcmUpOwotCi1pbnQgZHN0X3NlbmRfYmlvKHN0cnVjdCBkc3Rfc3RhdGUgKnN0LCBzdHJ1Y3QgZHN0X2NtZCAqY21kLCBzdHJ1Y3QgYmlvICpiaW8pOwotCi1pbnQgZHN0X3Byb2Nlc3NfaW8oc3RydWN0IGRzdF9zdGF0ZSAqc3QpOwotaW50IGRzdF9leHBvcnRfY3J5cHRvKHN0cnVjdCBkc3Rfbm9kZSAqbiwgc3RydWN0IGJpbyAqYmlvKTsKLWludCBkc3RfZXhwb3J0X3NlbmRfYmlvKHN0cnVjdCBiaW8gKmJpbyk7Ci1pbnQgZHN0X3N0YXJ0X2V4cG9ydChzdHJ1Y3QgZHN0X25vZGUgKm4pOwotCi1pbnQgX19pbml0IGRzdF9leHBvcnRfaW5pdCh2b2lkKTsKLXZvaWQgZHN0X2V4cG9ydF9leGl0KHZvaWQpOwotCi0vKiBQcml2YXRlIHN0cnVjdHVyZSBmb3IgZXhwb3J0IGJsb2NrIElPIHJlcXVlc3RzICovCi1zdHJ1Y3QgZHN0X2V4cG9ydF9wcml2Ci17Ci0Jc3RydWN0IGxpc3RfaGVhZAkJcmVxdWVzdF9lbnRyeTsKLQlzdHJ1Y3QgZHN0X3N0YXRlCQkqc3RhdGU7Ci0Jc3RydWN0IGJpbwkJCSpiaW87Ci0Jc3RydWN0IGRzdF9jbWQJCQljbWQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHN0X3RyYW5zX2dldChzdHJ1Y3QgZHN0X3RyYW5zICp0KQotewotCWF0b21pY19pbmMoJnQtPnJlZmNudCk7Ci19Ci0KLXN0cnVjdCBkc3RfdHJhbnMgKmRzdF90cmFuc19zZWFyY2goc3RydWN0IGRzdF9ub2RlICpub2RlLCBkc3RfZ2VuX3QgZ2VuKTsKLWludCBkc3RfdHJhbnNfcmVtb3ZlKHN0cnVjdCBkc3RfdHJhbnMgKnQpOwotaW50IGRzdF90cmFuc19yZW1vdmVfbm9sb2NrKHN0cnVjdCBkc3RfdHJhbnMgKnQpOwotdm9pZCBkc3RfdHJhbnNfcHV0KHN0cnVjdCBkc3RfdHJhbnMgKnQpOwotCi0vKgotICogQ29udmVydCBiaW8gaW50byBuZXR3b3JrIGNvbW1hbmQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkc3RfYmlvX3RvX2NtZChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBkc3RfY21kICpjbWQsCi0JCXUzMiBjb21tYW5kLCB1NjQgaWQpCi17Ci0JY21kLT5jbWQgPSBjb21tYW5kOwotCWNtZC0+ZmxhZ3MgPSAoYmlvLT5iaV9mbGFncyA8PCBCSU9fUE9PTF9CSVRTKSA+PiBCSU9fUE9PTF9CSVRTOwotCWNtZC0+cncgPSBiaW8tPmJpX3J3OwotCWNtZC0+c2l6ZSA9IGJpby0+Ymlfc2l6ZTsKLQljbWQtPmNzaXplID0gMDsKLQljbWQtPmlkID0gaWQ7Ci0JY21kLT5zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKLX07Ci0KLWludCBkc3RfdHJhbnNfc2VuZChzdHJ1Y3QgZHN0X3RyYW5zICp0KTsKLWludCBkc3RfdHJhbnNfY3J5cHRvKHN0cnVjdCBkc3RfdHJhbnMgKnQpOwotCi1pbnQgZHN0X25vZGVfY3J5cHRvX2luaXQoc3RydWN0IGRzdF9ub2RlICpuLCBzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCk7Ci12b2lkIGRzdF9ub2RlX2NyeXB0b19leGl0KHN0cnVjdCBkc3Rfbm9kZSAqbik7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRzdF9uZWVkX2NyeXB0byhzdHJ1Y3QgZHN0X25vZGUgKm4pCi17Ci0Jc3RydWN0IGRzdF9jcnlwdG9fY3RsICpjID0gJm4tPmNyeXB0bzsKLQkvKgotCSAqIExvZ2ljYWwgT1IgaXMgYXBwcm9wcmlhdGUgaGVyZSwgYnV0IGJvb2xlYW4gb25lIHByb2R1Y2VzCi0JICogbW9yZSBvcHRpbWFsIGNvZGUsIHNvIGl0IGlzIHVzZWQgaW5zdGVhZC4KLQkgKi8KLQlyZXR1cm4gKGMtPmhhc2hfYWxnb1swXSB8IGMtPmNpcGhlcl9hbGdvWzBdKTsKLX0KLQotaW50IGRzdF9ub2RlX3RyYW5zX2luaXQoc3RydWN0IGRzdF9ub2RlICpuLCB1bnNpZ25lZCBpbnQgc2l6ZSk7Ci12b2lkIGRzdF9ub2RlX3RyYW5zX2V4aXQoc3RydWN0IGRzdF9ub2RlICpuKTsKLQotLyoKLSAqIFBvb2wgb2YgdGhyZWFkcy4KLSAqIFJlYWR5IGxpc3QgY29udGFpbnMgdGhyZWFkcyBjdXJyZW50bHkgZnJlZSB0byBiZSB1c2VkLAotICogYWN0aXZlIG9uZSBjb250YWlucyB0aHJlYWRzIHdpdGggc29tZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlbS4KLSAqIENhbGxlciBjYW4gd2FpdCBpbiBnaXZlbiBxdWV1ZSB3aGVuIHRocmVhZCBpcyByZWFkeS4KLSAqLwotc3RydWN0IHRocmVhZF9wb29sCi17Ci0JaW50CQkJdGhyZWFkX251bTsKLQlzdHJ1Y3QgbXV0ZXgJCXRocmVhZF9sb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQJcmVhZHlfbGlzdCwgYWN0aXZlX2xpc3Q7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwotfTsKLQotdm9pZCB0aHJlYWRfcG9vbF9kZWxfd29ya2VyKHN0cnVjdCB0aHJlYWRfcG9vbCAqcCk7Ci12b2lkIHRocmVhZF9wb29sX2RlbF93b3JrZXJfaWQoc3RydWN0IHRocmVhZF9wb29sICpwLCB1bnNpZ25lZCBpbnQgaWQpOwotaW50IHRocmVhZF9wb29sX2FkZF93b3JrZXIoc3RydWN0IHRocmVhZF9wb29sICpwLAotCQljaGFyICpuYW1lLAotCQl1bnNpZ25lZCBpbnQgaWQsCi0JCXZvaWQgKigqIGluaXQpKHZvaWQgKmRhdGEpLAotCQl2b2lkICgqIGNsZWFudXApKHZvaWQgKmRhdGEpLAotCQl2b2lkICpkYXRhKTsKLQotdm9pZCB0aHJlYWRfcG9vbF9kZXN0cm95KHN0cnVjdCB0aHJlYWRfcG9vbCAqcCk7Ci1zdHJ1Y3QgdGhyZWFkX3Bvb2wgKnRocmVhZF9wb29sX2NyZWF0ZShpbnQgbnVtLCBjaGFyICpuYW1lLAotCQl2b2lkICooKiBpbml0KSh2b2lkICpkYXRhKSwKLQkJdm9pZCAoKiBjbGVhbnVwKSh2b2lkICpkYXRhKSwKLQkJdm9pZCAqZGF0YSk7Ci0KLWludCB0aHJlYWRfcG9vbF9zY2hlZHVsZShzdHJ1Y3QgdGhyZWFkX3Bvb2wgKnAsCi0JCWludCAoKiBzZXR1cCkodm9pZCAqc3RvcmVkX3ByaXZhdGUsIHZvaWQgKnNldHVwX2RhdGEpLAotCQlpbnQgKCogYWN0aW9uKSh2b2lkICpzdG9yZWRfcHJpdmF0ZSwgdm9pZCAqc2V0dXBfZGF0YSksCi0JCXZvaWQgKnNldHVwX2RhdGEsIGxvbmcgdGltZW91dCk7Ci1pbnQgdGhyZWFkX3Bvb2xfc2NoZWR1bGVfcHJpdmF0ZShzdHJ1Y3QgdGhyZWFkX3Bvb2wgKnAsCi0JCWludCAoKiBzZXR1cCkodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCi0JCWludCAoKiBhY3Rpb24pKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAotCQl2b2lkICpkYXRhLCBsb25nIHRpbWVvdXQsIHZvaWQgKmlkKTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfX0RTVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCmluZGV4IGYwN2YzNGQuLjI1ODA4OGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCkBAIC03Miw2ICs3Miw4IEBACiAJc3RydWN0IGlub2RlICogc19qb3VybmFsX2lub2RlOwogCXN0cnVjdCBqb3VybmFsX3MgKiBzX2pvdXJuYWw7CiAJc3RydWN0IGxpc3RfaGVhZCBzX29ycGhhbjsKKwlzdHJ1Y3QgbXV0ZXggc19vcnBoYW5fbG9jazsKKwlzdHJ1Y3QgbXV0ZXggc19yZXNpemVfbG9jazsKIAl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmpvdXJuYWxfYmRldjsKICNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfamJkLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfamJkLmgKaW5kZXggY2Y4MmQ1MS4uZDdiNWRkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2piZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19qYmQuaApAQCAtNDQsMTMgKzQ0LDEzIEBACiAKICNkZWZpbmUgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhzYikJKEVYVDNfU0lOR0xFREFUQV9UUkFOU19CTE9DS1MgKyBcCiAJCQkJCSBFWFQzX1hBVFRSX1RSQU5TX0JMT0NLUyAtIDIgKyBcCi0JCQkJCSAyKkVYVDNfUVVPVEFfVFJBTlNfQkxPQ0tTKHNiKSkKKwkJCQkJIEVYVDNfTUFYUVVPVEFTX1RSQU5TX0JMT0NLUyhzYikpCiAKIC8qIERlbGV0ZSBvcGVyYXRpb25zIHBvdGVudGlhbGx5IGhpdCBvbmUgZGlyZWN0b3J5J3MgbmFtZXNwYWNlIHBsdXMgYW4KICAqIGVudGlyZSBpbm9kZSwgcGx1cyBhcmJpdHJhcnkgYW1vdW50cyBvZiBiaXRtYXAvaW5kaXJlY3Rpb24gZGF0YS4gIEJlCiAgKiBnZW5lcm91cy4gIFdlIGNhbiBncm93IHRoZSBkZWxldGUgdHJhbnNhY3Rpb24gbGF0ZXIgaWYgbmVjZXNzYXJ5LiAqLwogCi0jZGVmaW5lIEVYVDNfREVMRVRFX1RSQU5TX0JMT0NLUyhzYikJKDIgKiBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTKHNiKSArIDY0KQorI2RlZmluZSBFWFQzX0RFTEVURV9UUkFOU19CTE9DS1Moc2IpICAgKEVYVDNfTUFYUVVPVEFTX1RSQU5TX0JMT0NLUyhzYikgKyA2NCkKIAogLyogRGVmaW5lIGFuIGFyYml0cmFyeSBsaW1pdCBmb3IgdGhlIGFtb3VudCBvZiBkYXRhIHdlIHdpbGwgYW50aWNpcGF0ZQogICogd3JpdGluZyB0byBhbnkgZ2l2ZW4gdHJhbnNhY3Rpb24uICBGb3IgdW5ib3VuZGVkIHRyYW5zYWN0aW9ucyBzdWNoIGFzCkBAIC04Niw2ICs4Niw5IEBACiAjZGVmaW5lIEVYVDNfUVVPVEFfSU5JVF9CTE9DS1Moc2IpIDAKICNkZWZpbmUgRVhUM19RVU9UQV9ERUxfQkxPQ0tTKHNiKSAwCiAjZW5kaWYKKyNkZWZpbmUgRVhUM19NQVhRVU9UQVNfVFJBTlNfQkxPQ0tTKHNiKSAoTUFYUVVPVEFTKkVYVDNfUVVPVEFfVFJBTlNfQkxPQ0tTKHNiKSkKKyNkZWZpbmUgRVhUM19NQVhRVU9UQVNfSU5JVF9CTE9DS1Moc2IpIChNQVhRVU9UQVMqRVhUM19RVU9UQV9JTklUX0JMT0NLUyhzYikpCisjZGVmaW5lIEVYVDNfTUFYUVVPVEFTX0RFTF9CTE9DS1Moc2IpIChNQVhRVU9UQVMqRVhUM19RVU9UQV9ERUxfQkxPQ0tTKHNiKSkKIAogaW50CiBleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDdlMzAxMmUuLjkxNDdjYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTIyOTcsNiArMjI5Nyw3IEBACiBleHRlcm4gaW50IGdlbmVyaWNfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqLCBjaGFyIF9fdXNlciAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgZ2VuZXJpY19maWxsYXR0cihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGtzdGF0ICopOwogZXh0ZXJuIGludCB2ZnNfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXQgKik7Cit2b2lkIF9faW5vZGVfYWRkX2J5dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBieXRlcyk7CiB2b2lkIGlub2RlX2FkZF9ieXRlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYnl0ZXMpOwogdm9pZCBpbm9kZV9zdWJfYnl0ZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJ5dGVzKTsKIGxvZmZfdCBpbm9kZV9nZXRfYnl0ZXMoc3RydWN0IGlub2RlICppbm9kZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tmaWZvLmggYi9pbmNsdWRlL2xpbnV4L2tmaWZvLmgKaW5kZXggNDg2ZThhZC4uM2Q0NGU5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZmlmby5oCisrKyBiL2luY2x1ZGUvbGludXgva2ZpZm8uaApAQCAtNjksOCArNjksOCBAQAogICogQG5hbWU6IG5hbWUgb2YgdGhlIGRlY2xhcmVkIGtmaWZvIGRhdGF0eXBlCiAgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgZmlmbyBidWZmZXIKICAqCi0gKiBOb3RlOiB0aGUgbWFjcm8gY2FuIGJlIHVzZWQgaW5zaWRlIHN0cnVjdCBvciB1bmlvbiBkZWNsYXJhdGlvbgotICogTm90ZTogdGhlIG1hY3JvIGNyZWF0ZXMgdHdvIG9iamVjdHM6CisgKiBOb3RlMTogdGhlIG1hY3JvIGNhbiBiZSB1c2VkIGluc2lkZSBzdHJ1Y3Qgb3IgdW5pb24gZGVjbGFyYXRpb24KKyAqIE5vdGUyOiB0aGUgbWFjcm8gY3JlYXRlcyB0d28gb2JqZWN0czoKICAqICBBIGtmaWZvIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBhIGJ1ZmZlciBmb3IgdGhlIGtmaWZvCiAgKiAgb2JqZWN0IG5hbWVkIG5hbWUjI2tmaWZvX2J1ZmZlcgogICovCkBAIC04Myw3ICs4Myw2IEBACiAvKioKICAqIElOSVRfS0ZJRk8gLSBJbml0aWFsaXplIGEga2ZpZm8gZGVjbGFyZWQgYnkgREVDTEFSRURfS0ZJRk8KICAqIEBuYW1lOiBuYW1lIG9mIHRoZSBkZWNsYXJlZCBrZmlmbyBkYXRhdHlwZQotICogQHNpemU6IHNpemUgb2YgdGhlIGZpZm8gYnVmZmVyCiAgKi8KICNkZWZpbmUgSU5JVF9LRklGTyhuYW1lKSBcCiAJbmFtZSA9IF9fa2ZpZm9faW5pdGlhbGl6ZXIoc2l6ZW9mKG5hbWUjI2tmaWZvX2J1ZmZlcikgLSBcCkBAIC05NCw4ICs5Myw4IEBACiAgKiBAbmFtZTogbmFtZSBvZiB0aGUgZGVjbGFyZWQga2ZpZm8gZGF0YXR5cGUKICAqIEBzaXplOiBzaXplIG9mIHRoZSBmaWZvIGJ1ZmZlcgogICoKLSAqIE5vdGU6IHRoZSBtYWNybyBjYW4gYmUgdXNlZCBmb3IgZ2xvYmFsIGFuZCBsb2NhbCBrZmlmbyBkYXRhIHR5cGUgdmFyaWFibGVzCi0gKiBOb3RlOiB0aGUgbWFjcm8gY3JlYXRlcyB0d28gb2JqZWN0czoKKyAqIE5vdGUxOiB0aGUgbWFjcm8gY2FuIGJlIHVzZWQgZm9yIGdsb2JhbCBhbmQgbG9jYWwga2ZpZm8gZGF0YSB0eXBlIHZhcmlhYmxlcworICogTm90ZTI6IHRoZSBtYWNybyBjcmVhdGVzIHR3byBvYmplY3RzOgogICogIEEga2ZpZm8gb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGEgYnVmZmVyIGZvciB0aGUga2ZpZm8KICAqICBvYmplY3QgbmFtZWQgbmFtZSMja2ZpZm9fYnVmZmVyCiAgKi8KQEAgLTI0OSw3ICsyNDgsNyBAQAogZXh0ZXJuIF9fbXVzdF9jaGVjayB1bnNpZ25lZCBpbnQga2ZpZm9fdG9fdXNlcihzdHJ1Y3Qga2ZpZm8gKmZpZm8sCiAJdm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBpbnQgbik7CiAKLS8qKgorLyoKICAqIF9fa2ZpZm9fYWRkX291dCBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gZm9yIHVwZGF0aW5nIHRoZSBvdXQgb2Zmc2V0CiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2tmaWZvX2FkZF9vdXQoc3RydWN0IGtmaWZvICpmaWZvLApAQCAtMjU5LDcgKzI1OCw3IEBACiAJZmlmby0+b3V0ICs9IG9mZjsKIH0KIAotLyoqCisvKgogICogX19rZmlmb19hZGRfaW4gaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIGZvciB1cGRhdGluZyB0aGUgaW4gb2Zmc2V0CiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2tmaWZvX2FkZF9pbihzdHJ1Y3Qga2ZpZm8gKmZpZm8sCkBAIC0yNjksNyArMjY4LDcgQEAKIAlmaWZvLT5pbiArPSBvZmY7CiB9CiAKLS8qKgorLyoKICAqIF9fa2ZpZm9fb2ZmIGludGVybmFsIGhlbHBlciBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgdGhlIGluZGV4IG9mIGEKICAqIGdpdmVuIG9mZmVzZXQKICAqLwpAQCAtMjc4LDcgKzI3Nyw3IEBACiAJcmV0dXJuIG9mZiAmIChmaWZvLT5zaXplIC0gMSk7CiB9CiAKLS8qKgorLyoKICAqIF9fa2ZpZm9fcGVla19uIGludGVybmFsIGhlbHBlciBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5hdGUgdGhlIGxlbmd0aCBvZgogICogdGhlIG5leHQgcmVjb3JkIGluIHRoZSBmaWZvCiAgKi8KQEAgLTI5OSw3ICsyOTgsNyBAQAogI3VuZGVmCV9fS0ZJRk9fR0VUCiB9CiAKLS8qKgorLyoKICAqIF9fa2ZpZm9fcG9rZV9uIGludGVybmFsIGhlbHBlciBmdW5jdGlvbiBmb3Igc3RvcmluZyB0aGUgbGVuZ3RoIG9mCiAgKiB0aGUgbmV4dCByZWNvcmQgaW50byB0aGUgZmlmbwogICovCkBAIC0zMTksNyArMzE4LDcgQEAKICN1bmRlZglfX0tGSUZPX1BVVAogfQogCi0vKioKKy8qCiAgKiBfX2tmaWZvX2luXy4uLiBpbnRlcm5hbCBmdW5jdGlvbnMgZm9yIHB1dCBkYXRlIGludG8gdGhlIGZpZm8KICAqIGRvIG5vdCBjYWxsIGl0IGRpcmVjdGx5LCB1c2Uga2ZpZm9faW5fcmVjKCkgaW5zdGVhZAogICovCkBAIC0zNjcsNyArMzY2LDcgQEAKIAlyZXR1cm4gX19rZmlmb19pbl9yZWMoZmlmbywgZnJvbSwgbiwgcmVjc2l6ZSk7CiB9CiAKLS8qKgorLyoKICAqIF9fa2ZpZm9fb3V0Xy4uLiBpbnRlcm5hbCBmdW5jdGlvbnMgZm9yIGdldCBkYXRlIGZyb20gdGhlIGZpZm8KICAqIGRvIG5vdCBjYWxsIGl0IGRpcmVjdGx5LCB1c2Uga2ZpZm9fb3V0X3JlYygpIGluc3RlYWQKICAqLwpAQCAtNDI1LDcgKzQyNCw3IEBACiAJcmV0dXJuIF9fa2ZpZm9fb3V0X3JlYyhmaWZvLCB0bywgbiwgcmVjc2l6ZSwgdG90YWwpOwogfQogCi0vKioKKy8qCiAgKiBfX2tmaWZvX2Zyb21fdXNlcl8uLi4gaW50ZXJuYWwgZnVuY3Rpb25zIGZvciB0cmFuc2ZlciBmcm9tIHVzZXIgc3BhY2UgaW50bwogICogdGhlIGZpZm8uIGRvIG5vdCBjYWxsIGl0IGRpcmVjdGx5LCB1c2Uga2ZpZm9fZnJvbV91c2VyX3JlYygpIGluc3RlYWQKICAqLwpAQCAtNDc0LDcgKzQ3Myw3IEBACiAJcmV0dXJuIF9fa2ZpZm9fZnJvbV91c2VyX3JlYyhmaWZvLCBmcm9tLCBuLCByZWNzaXplKTsKIH0KIAotLyoqCisvKgogICogX19rZmlmb190b191c2VyXy4uLiBpbnRlcm5hbCBmdW5jdGlvbnMgZm9yIHRyYW5zZmVyIGZpZm8gZGF0YSBpbnRvIHVzZXIgc3BhY2UKICAqIGRvIG5vdCBjYWxsIGl0IGRpcmVjdGx5LCB1c2Uga2ZpZm9fdG9fdXNlcl9yZWMoKSBpbnN0ZWFkCiAgKi8KQEAgLTUzMyw3ICs1MzIsNyBAQAogCXJldHVybiBfX2tmaWZvX3RvX3VzZXJfcmVjKGZpZm8sIHRvLCBuLCByZWNzaXplLCB0b3RhbCk7CiB9CiAKLS8qKgorLyoKICAqIF9fa2ZpZm9fcGVla18uLi4gaW50ZXJuYWwgZnVuY3Rpb25zIGZvciBwZWVrIGludG8gdGhlIG5leHQgZmlmbyByZWNvcmQKICAqIGRvIG5vdCBjYWxsIGl0IGRpcmVjdGx5LCB1c2Uga2ZpZm9fcGVla19yZWMoKSBpbnN0ZWFkCiAgKi8KQEAgLTU1Nyw3ICs1NTYsNyBAQAogCXJldHVybiBfX2tmaWZvX3BlZWtfbihmaWZvLCByZWNzaXplKTsKIH0KIAotLyoqCisvKgogICogX19rZmlmb19za2lwXy4uLiBpbnRlcm5hbCBmdW5jdGlvbnMgZm9yIHNraXAgdGhlIG5leHQgZmlmbyByZWNvcmQKICAqIGRvIG5vdCBjYWxsIGl0IGRpcmVjdGx5LCB1c2Uga2ZpZm9fc2tpcF9yZWMoKSBpbnN0ZWFkCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcXVvdGEuaCBiL2luY2x1ZGUvbGludXgvcXVvdGEuaAppbmRleCBlNzBlNjIxLi5hNjg2MWYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3F1b3RhLmgKKysrIGIvaW5jbHVkZS9saW51eC9xdW90YS5oCkBAIC0zMTUsOCArMzE1LDkgQEAKIAlpbnQgKCpjbGFpbV9zcGFjZSkgKHN0cnVjdCBpbm9kZSAqLCBxc2l6ZV90KTsKIAkvKiByZWxlYXNlIHJzdmVkIHF1b3RhIGZvciBkZWxheWVkIGFsbG9jICovCiAJdm9pZCAoKnJlbGVhc2VfcnN2KSAoc3RydWN0IGlub2RlICosIHFzaXplX3QpOwotCS8qIGdldCByZXNlcnZlZCBxdW90YSBmb3IgZGVsYXllZCBhbGxvYyAqLwotCXFzaXplX3QgKCpnZXRfcmVzZXJ2ZWRfc3BhY2UpIChzdHJ1Y3QgaW5vZGUgKik7CisJLyogZ2V0IHJlc2VydmVkIHF1b3RhIGZvciBkZWxheWVkIGFsbG9jLCB2YWx1ZSByZXR1cm5lZCBpcyBtYW5hZ2VkIGJ5CisJICogcXVvdGEgY29kZSBvbmx5ICovCisJcXNpemVfdCAqKCpnZXRfcmVzZXJ2ZWRfc3BhY2UpIChzdHJ1Y3QgaW5vZGUgKik7CiB9OwogCiAvKiBPcGVyYXRpb25zIGhhbmRsaW5nIHJlcXVlc3RzIGZyb20gdXNlcnNwYWNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKaW5kZXggOWQ2OGZlZC4uY2ZhODMwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzZnMuaApAQCAtOTksOCArOTksOSBAQAogdm9pZCBzeXNmc19yZW1vdmVfZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cik7CiAKIGludCBfX211c3RfY2hlY2sgc3lzZnNfY3JlYXRlX2Jpbl9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cik7Ci12b2lkIHN5c2ZzX3JlbW92ZV9iaW5fZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIpOworCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cik7Cit2b2lkIHN5c2ZzX3JlbW92ZV9iaW5fZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyKTsKIAogaW50IF9fbXVzdF9jaGVjayBzeXNmc19jcmVhdGVfbGluayhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmplY3QgKnRhcmdldCwKIAkJCQkgICBjb25zdCBjaGFyICpuYW1lKTsKQEAgLTE3NSwxMyArMTc2LDEzIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIpCisJCQkJCWNvbnN0IHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyKQogewogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQkgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIpCisJCQkJCSBjb25zdCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cikKIHsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCA4N2YxZjQ3Li5jNTM1Y2M0IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtMjA0NSwxMSArMjA0NSwxMCBAQAogCiAJdHJhY2Vfc2NoZWRfbWlncmF0ZV90YXNrKHAsIG5ld19jcHUpOwogCi0JaWYgKHRhc2tfY3B1KHApID09IG5ld19jcHUpCi0JCXJldHVybjsKLQotCXAtPnNlLm5yX21pZ3JhdGlvbnMrKzsKLQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQ1BVX01JR1JBVElPTlMsIDEsIDEsIE5VTEwsIDApOworCWlmICh0YXNrX2NwdShwKSAhPSBuZXdfY3B1KSB7CisJCXAtPnNlLm5yX21pZ3JhdGlvbnMrKzsKKwkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0NQVV9NSUdSQVRJT05TLCAxLCAxLCBOVUxMLCAwKTsKKwl9CiAKIAlfX3NldF90YXNrX2NwdShwLCBuZXdfY3B1KTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvS2NvbmZpZyBiL3NvdW5kL2NvcmUvS2NvbmZpZwppbmRleCBjMTU2ODJhLi40NzU0NTVjIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL0tjb25maWcKKysrIGIvc291bmQvY29yZS9LY29uZmlnCkBAIC01LDYgKzUsNyBAQAogY29uZmlnIFNORF9QQ00KIAl0cmlzdGF0ZQogCXNlbGVjdCBTTkRfVElNRVIKKwlzZWxlY3QgR0NECiAKIGNvbmZpZyBTTkRfSFdERVAKIAl0cmlzdGF0ZQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fdGltZXIuYyBiL3NvdW5kL2NvcmUvcGNtX3RpbWVyLmMKaW5kZXggY2E4MDY4Yi4uYjAxZDk0OCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3BjbV90aW1lci5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9nY2QuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvdGltZXIuaD4KQEAgLTI4LDIyICsyOSw2IEBACiAgKiAgVGltZXIgZnVuY3Rpb25zCiAgKi8KIAotLyogR3JlYXRlc3QgY29tbW9uIGRpdmlzb3IgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdjZCh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikKLXsKLQl1bnNpZ25lZCBsb25nIHI7Ci0JaWYgKGEgPCBiKSB7Ci0JCXIgPSBhOwotCQlhID0gYjsKLQkJYiA9IHI7Ci0JfQotCXdoaWxlICgociA9IGEgJSBiKSAhPSAwKSB7Ci0JCWEgPSBiOwotCQliID0gcjsKLQl9Ci0JcmV0dXJuIGI7Ci19Ci0KIHZvaWQgc25kX3BjbV90aW1lcl9yZXNvbHV0aW9uX2NoYW5nZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAl1bnNpZ25lZCBsb25nIHJhdGUsIG11bHQsIGZzaXplLCBsLCBwb3N0OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKaW5kZXggOWNmZGI3Ny4uOTUwZWU1Y2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtMTA4NiwxMSArMTA4Niw2IEBACiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9Ci0JLyogYXVkaW8gY29kZWMgc2hvdWxkIG92ZXJyaWRlIHRoZSBtaXhlciBuYW1lICovCi0JaWYgKGNvZGVjLT5hZmcgfHwgISpjb2RlYy0+YnVzLT5jYXJkLT5taXhlcm5hbWUpCi0JCXNucHJpbnRmKGNvZGVjLT5idXMtPmNhcmQtPm1peGVybmFtZSwKLQkJCSBzaXplb2YoY29kZWMtPmJ1cy0+Y2FyZC0+bWl4ZXJuYW1lKSwKLQkJCSAiJXMgJXMiLCBjb2RlYy0+dmVuZG9yX25hbWUsIGNvZGVjLT5jaGlwX25hbWUpOwogCiAJaWYgKGlzX2dlbmVyaWNfY29uZmlnKGNvZGVjKSkgewogCQllcnIgPSBzbmRfaGRhX3BhcnNlX2dlbmVyaWNfY29kZWMoY29kZWMpOwpAQCAtMTEwOSw2ICsxMTA0LDExIEBACiAgcGF0Y2hlZDoKIAlpZiAoIWVyciAmJiBjb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50KQogCQllcnIgPSBpbml0X3Vuc29sX3F1ZXVlKGNvZGVjLT5idXMpOworCS8qIGF1ZGlvIGNvZGVjIHNob3VsZCBvdmVycmlkZSB0aGUgbWl4ZXIgbmFtZSAqLworCWlmICghZXJyICYmIChjb2RlYy0+YWZnIHx8ICEqY29kZWMtPmJ1cy0+Y2FyZC0+bWl4ZXJuYW1lKSkKKwkJc25wcmludGYoY29kZWMtPmJ1cy0+Y2FyZC0+bWl4ZXJuYW1lLAorCQkJIHNpemVvZihjb2RlYy0+YnVzLT5jYXJkLT5taXhlcm5hbWUpLAorCQkJICIlcyAlcyIsIGNvZGVjLT52ZW5kb3JfbmFtZSwgY29kZWMtPmNoaXBfbmFtZSk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfY29kZWNfY29uZmlndXJlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IDliNTZmOTMuLmZmOGFkNDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtMjMyMiw2ICsyMzIyLDcgQEAKICAqIHdoaXRlL2JsYWNrLWxpc3QgZm9yIGVuYWJsZV9tc2kKICAqLwogc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIG1zaV9ibGFja19saXN0W10gX19kZXZpbml0ZGF0YSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MWYyLCAiQVNVUyIsIDApLCAvKiBBdGhsb242NCBYMiArIG52aWRpYSAqLwogCXt9CiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYwppbmRleCA0YjIwMGRhLi5mZTA0MjNjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMKQEAgLTY2LDYgKzY2LDcgQEAKIC8qIGF2YWlsYWJsZSBtb2RlbHMgKi8KIGVudW0gewogCUNTNDIwWF9NQlA1NSwKKwlDUzQyMFhfSU1BQzI3LAogCUNTNDIwWF9BVVRPLAogCUNTNDIwWF9NT0RFTFMKIH07CkBAIC04MjcsNyArODI4LDggQEAKIAkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAogCQkJCSAgICBocF9wcmVzZW50ID8gMCA6IFBJTl9PVVQpOwogCX0KLQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnID09IENTNDIwWF9NQlA1NSkgeworCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPT0gQ1M0MjBYX01CUDU1IHx8CisJICAgIHNwZWMtPmJvYXJkX2NvbmZpZyA9PSBDUzQyMFhfSU1BQzI3KSB7CiAJCXVuc2lnbmVkIGludCBncGlvID0gaHBfcHJlc2VudCA/IDB4MDIgOiAweDA4OwogCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDAxLCAwLAogCQkJCSAgICBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIGdwaW8pOwpAQCAtMTA2OSwxMiArMTA3MSwxNCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqY3M0MjB4X21vZGVsc1tDUzQyMFhfTU9ERUxTXSA9IHsKIAlbQ1M0MjBYX01CUDU1XSA9ICJtYnA1NSIsCisJW0NTNDIwWF9JTUFDMjddID0gImltYWMyNyIsCiAJW0NTNDIwWF9BVVRPXSA9ICJhdXRvIiwKIH07CiAKIAogc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGNzNDIweF9jZmdfdGJsW10gPSB7CiAJU05EX1BDSV9RVUlSSygweDEwZGUsIDB4Y2I3OSwgIk1hY0Jvb2tQcm8gNSw1IiwgQ1M0MjBYX01CUDU1KSwKKwlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHg3MjcwLCAiSU1hYyAyNyBJbmNoIiwgQ1M0MjBYX0lNQUMyNyksCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIApAQCAtMTA5Nyw4ICsxMTAxLDIzIEBACiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBjc19waW5jZmcgaW1hYzI3X3BpbmNmZ3NbXSA9IHsKKwl7IDB4MDksIDB4MDEyYjQwNTAgfSwKKwl7IDB4MGEsIDB4OTAxMDAxNDAgfSwKKwl7IDB4MGIsIDB4OTAxMDAxNDIgfSwKKwl7IDB4MGMsIDB4MDE4YjMwMjAgfSwKKwl7IDB4MGQsIDB4OTBhMDAxMTAgfSwKKwl7IDB4MGUsIDB4NDAwMDAwZjAgfSwKKwl7IDB4MGYsIDB4MDFjYmUwMzAgfSwKKwl7IDB4MTAsIDB4MDE0YmUwNjAgfSwKKwl7IDB4MTIsIDB4MDFhYjkwNzAgfSwKKwl7IDB4MTUsIDB4NDAwMDAwZjAgfSwKKwl7fSAvKiB0ZXJtaW5hdG9yICovCit9OworCiBzdGF0aWMgc3RydWN0IGNzX3BpbmNmZyAqY3NfcGluY2Znc1tDUzQyMFhfTU9ERUxTXSA9IHsKIAlbQ1M0MjBYX01CUDU1XSA9IG1icDU1X3BpbmNmZ3MsCisJW0NTNDIwWF9JTUFDMjddID0gaW1hYzI3X3BpbmNmZ3MsCiB9OwogCiBzdGF0aWMgdm9pZCBmaXhfcGluY2ZnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgbW9kZWwpCkBAIC0xMTI4LDYgKzExNDcsNyBAQAogCQlmaXhfcGluY2ZnKGNvZGVjLCBzcGVjLT5ib2FyZF9jb25maWcpOwogCiAJc3dpdGNoIChzcGVjLT5ib2FyZF9jb25maWcpIHsKKwljYXNlIENTNDIwWF9JTUFDMjc6CiAJY2FzZSBDUzQyMFhfTUJQNTU6CiAJCS8qIEdQSU8xID0gaGVhZHBob25lcyAqLwogCQkvKiBHUElPMyA9IHNwZWFrZXJzICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKaW5kZXggM2Q1OWY4My4uZWVkYTdiZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYwpAQCAtMjEwNCw2ICsyMTA0LDcgQEAKICAgICAxMDI4MDIwNAogICAgIDEwMjgwMjFGCiAgICAgMTAyODAyMjggKERlbGwgVm9zdHJvIDE1MDApCisgICAgMTAyODAyMjkgKERlbGwgVm9zdHJvIDE3MDApCiAqLwogc3RhdGljIHVuc2lnbmVkIGludCBkZWxsXzkyMDVfbTQyX3Bpbl9jb25maWdzWzEyXSA9IHsKIAkweDAzMjExMDFGLCAweDAzQTExMDIwLCAweDQwMDAwM0ZBLCAweDkwMTcwMzEwLApAQCAtMjE4OSw2ICsyMTkwLDggQEAKIAkJICAgICAgIkRlbGwgSW5zcGlyb24iLCBTVEFDXzkyMDVfREVMTF9NNDQpLAogCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAyMjgsCiAJCSAgICAgICJEZWxsIFZvc3RybyAxNTAwIiwgU1RBQ185MjA1X0RFTExfTTQyKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMjI5LAorCQkgICAgICAiRGVsbCBWb3N0cm8gMTcwMCIsIFNUQUNfOTIwNV9ERUxMX000MiksCiAJLyogR2F0ZXdheSAqLwogCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDA1NjAsICJHYXRld2F5IFQ2ODM0YyIsIFNUQUNfOTIwNV9FQVBEKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHgwNTY1LCAiR2F0ZXdheSBUMTYxNiIsIFNUQUNfOTIwNV9FQVBEKSwKQEAgLTM3NzksMTUgKzM3ODIsMTYgQEAKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIG5pZCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKLQkJLyogSURUL1NUQUMgY29kZWNzIGhhdmUgbGluZWFyIGJlZXAgdG9uZSBwYXJhbWV0ZXIgKi8KLQkJY29kZWMtPmJlZXAtPmxpbmVhcl90b25lID0gMTsKLQkJLyogaWYgbm8gYmVlcCBzd2l0Y2ggaXMgYXZhaWxhYmxlLCBtYWtlIGl0cyBvd24gb25lICovCi0JCWNhcHMgPSBxdWVyeV9hbXBfY2Fwcyhjb2RlYywgbmlkLCBIREFfT1VUUFVUKTsKLQkJaWYgKGNvZGVjLT5iZWVwICYmCi0JCSAgICAhKChjYXBzICYgQUNfQU1QQ0FQX01VVEUpID4+IEFDX0FNUENBUF9NVVRFX1NISUZUKSkgewotCQkJZXJyID0gc3RhYzkyeHhfYmVlcF9zd2l0Y2hfY3RsKGNvZGVjKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7CisJCWlmIChjb2RlYy0+YmVlcCkgeworCQkJLyogSURUL1NUQUMgY29kZWNzIGhhdmUgbGluZWFyIGJlZXAgdG9uZSBwYXJhbWV0ZXIgKi8KKwkJCWNvZGVjLT5iZWVwLT5saW5lYXJfdG9uZSA9IDE7CisJCQkvKiBpZiBubyBiZWVwIHN3aXRjaCBpcyBhdmFpbGFibGUsIG1ha2UgaXRzIG93biBvbmUgKi8KKwkJCWNhcHMgPSBxdWVyeV9hbXBfY2Fwcyhjb2RlYywgbmlkLCBIREFfT1VUUFVUKTsKKwkJCWlmICghKGNhcHMgJiBBQ19BTVBDQVBfTVVURSkpIHsKKwkJCQllcnIgPSBzdGFjOTJ4eF9iZWVwX3N3aXRjaF9jdGwoY29kZWMpOworCQkJCWlmIChlcnIgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQogCQl9CiAJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYwppbmRleCAwYWMxMjE1Li5lMjM3YmY2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMKQEAgLTQ2Myw3ICs0NjMsOCBAQAogewogCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwogCi0Jc29jX2FjOTdfb3BzLndyaXRlKGNvZGVjLT5hYzk3LCByZWcsIHZhbCk7CisJaWYgKHJlZyA8IDB4N2MpCisJCXNvY19hYzk3X29wcy53cml0ZShjb2RlYy0+YWM5NywgcmVnLCB2YWwpOwogCXJlZyA9IHJlZyA+PiAxOwogCWlmIChyZWcgPCAoQVJSQVlfU0laRSh3bTk3MTJfcmVnKSkpCiAJCWNhY2hlW3JlZ10gPSB2YWw7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW14L214Mjd2aXNfd204OTc0LmMgYi9zb3VuZC9zb2MvaW14L214Mjd2aXNfd204OTc0LmMKaW5kZXggMDI2N2QyZC4uMDdkMmEyNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2lteC9teDI3dmlzX3dtODk3NC5jCisrKyBiL3NvdW5kL3NvYy9pbXgvbXgyN3Zpc193bTg5NzQuYwpAQCAtMTgwLDcgKzE4MCw4IEBACiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmRhaS0+Y29kZWNfZGFpOwogCiAJLyogZGlzYWJsZSB0aGUgUExMICovCi0JcmV0dXJuIGNvZGVjX2RhaS0+b3BzLT5zZXRfcGxsKGNvZGVjX2RhaSwgSUdOT1JFRF9BUkcsIDAsIDApOworCXJldHVybiBjb2RlY19kYWktPm9wcy0+c2V0X3BsbChjb2RlY19kYWksIElHTk9SRURfQVJHLCBJR05PUkVEX0FSRywKKwkJCQkgICAgICAgMCwgMCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvZnNpLmMgYi9zb3VuZC9zb2Mvc2gvZnNpLmMKaW5kZXggOWM0OWMxMS4uNDI4MTNiOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL2ZzaS5jCisrKyBiL3NvdW5kL3NvYy9zaC9mc2kuYwpAQCAtODc2LDcgKzg3Niw3IEBACiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKCFyZXMgfHwgIWlycSkgeworCWlmICghcmVzIHx8IChpbnQpaXJxIDw9IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm90IGVub3VnaCBGU0kgcGxhdGZvcm0gcmVzb3VyY2VzLlxuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsK